29

我让用户在 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])

两个DateTimes 都不会在我之前设置的用户的时区中,例如:

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

如何将上述DateTimes 解析为正确的时区?我知道该DateTime.new方法有时间偏移的第 7 个参数。有没有一种简单的方法可以在给定时间内查找时区的偏移量?或者我应该使用其他的东西DateTime吗?

4

5 回答 5

37

尝试:

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)")
于 2013-11-08T09:57:54.807 回答
23

您可以使用以下代码创建DateTime具有所需TimeZone.

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

更新:使用的 1.9.1 版本的Rails Ruby,下面的行就像魔术一样做同样的工作。

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

文档在这里

于 2013-06-29T04:39:24.723 回答
22

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文档。

于 2013-04-06T09:29:06.393 回答
5

DateTime.new接受从 ruby​​ 1.9.1 开始的可选偏移参数(作为第七个)

我们可以写

DateTime.new(2018, 1, 1, 0, 0, 0, Time.zone.formatted_offset)
于 2018-03-29T15:04:31.910 回答
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
于 2013-08-18T10:54:28.347 回答