如何从现有的 Time.zone for Rails 创建 Ruby DateTime?

问题描述 投票:0回答:6

我让用户在 Ruby on Rails 网站中输入日期。我将日期解析为 DateTime 对象,如下所示:

date = DateTime.new(params[:year].to_i, params[:month].to_i, params[:day].to_i, params[:hour].to_i, params[:minute].to_i)

date = DateTime.parse(params[:date])

两个

DateTime
都将位于我之前设置的用户时区,例如:

Time.zone = "Pacific Time (US & Canada)"

如何解析上述

DateTime
以使其位于正确的时区?我知道
DateTime.new
方法有第 7 个参数用于时间偏移。有没有一种简单的方法可以查找给定时间中时区的偏移量?或者我应该使用
DateTime
以外的东西?

ruby-on-rails ruby datetime ruby-on-rails-3.2 timezone
6个回答
43
投票

尝试:

Time.zone = "Pacific Time (US & Canada)"
Time.zone.parse('8-11-2013 23:59:59') #=> Fri, 08 Nov 2013 23:59:59 PST -08:00 

Time.now.in_time_zone("Pacific Time (US & Canada)")

DateTime.now.in_time_zone("Pacific Time (US & Canada)")

25
投票

您可以使用以下代码创建一个带有您想要的

DateTime
TimeZone
对象。

DateTime.new(2013, 6, 29, 10, 15, 30).change(:offset => "+0530")

在 Ruby v1.9.1 中,下面的代码可以像魔术一样完成同样的工作。

DateTime.new(2013, 6, 29, 10, 15, 30, "+0530")

文档这里


23
投票

如果您之前设置了

Time.zone.local
,则可以使用
Time.zone

user_time = Time.zone.local(params[:year].to_i, params[:month].to_i, params[:day].to_i, params[:hour].to_i, params[:minute].to_i, 0)

查看

ActiveSupport::TimeWithZone
文档。


7
投票
从 ruby 1.9.1 开始,

DateTime.new
接受可选的 offset 参数(作为第七个)

我们可以写

DateTime.new(2018, 1, 1, 0, 0, 0, Time.zone.formatted_offset)

1
投票

如果您已经有一个名为“datetime”的正确 DateTime 对象,并且想要复制它,您可以简单地在其上调用“getutc”,然后使用“in_time_zone”

DateTime.new(datetime.getutc.year, datetime.getutc.month, datetime.getutc.day, time.getutc.hour, time.getutc.min).in_time_zone

0
投票

令人惊讶的是,这些答案都不是很好。

DateTime 现在采用第 7 个时区参数:

DateTime.new(2024, 7, 2, 6, 30, 0, 'PST')
© www.soinside.com 2019 - 2024. All rights reserved.