将字符串转换为特定时区的日期时间

3

我正在使用datetimepicker,并需要将从params获取的字符串datetime保存为特定用户依赖的时区中的datetime。这将允许我将正确的UTC datetime保存到数据库中。

params[:notify_at] #=> "2014-07-05 14:30:00"

user.time_zone #=> #<ActiveSupport::TimeZone:0x00000007535ac8 @name="Warsaw", @utc_offset=nil, @tzinfo=#<TZInfo::TimezoneProxy: Europe/Warsaw>, @current_period=nil>

我希望能做类似以下的事情:

date = params[:notify_at].to_datetime(user.time_zone) #=> Sat, 05 Jul 2014 12:30:00 +0000
(its 14:30 in user's localtime but 12:30 in UTC)
2个回答

8
您可以使用 in_time_zone 方法。例如:
DateTime.current.in_time_zone("Alaska")
# => Fri, 23 May 2014 07:21:30 AKDT -08:00

针对您的使用情况而言:

params[:notify_at].to_datetime.in_time_zone(user.time_zone)

专业提示:如果使用Rails v4+,实际上可以直接在字符串上执行此操作:

"2014-07-05 14:30:00".in_time_zone("Alaska")
# => Sat, 05 Jul 2014 14:30:00 AKDT -08:00

更新

您可以像这样直接将字符串解析为一个时区(字符串应该已经在该时区内):

Time.zone.parse("2014-07-05 14:30:00")
# => Sat, 05 Jul 2014 14:30:00 CEST +02:00

因此,对于您的使用情况,请执行以下操作:
user.time_zone.parse(params[:notify_at])

已经尝试过这种方式,但这不是我想要做的。to_datetime将字符串转换为UTC时间(所以无论如何都会变成14:30 UTC)。在调用in_time_zone('Warsaw')之后,它给出了Sat, 05 Jul 2014 16:30:00 CEST +02:00,这是错误的 - 我需要的是Sat, 05 Jul 2014 14:30:00 CEST +02:00 - undefined
是的,就是这样,我自己也已经弄明白了,但还是谢谢你给出正确的答案 :) - undefined

-1
尝试这个:-
date = params[:notify_at].to_datetime.in_time_zone(user.time_zone)

Rails控制台输出:

1.9.3p385 :004 > d= "2014-07-05 14:30:00"
=> "2014-07-05 14:30:00" 
1.9.3p385 :010 > d.to_datetime.in_time_zone("Pacific Time (US & Canada)")
=> Sat, 05 Jul 2014 07:30:00 PDT -07:00 
1.9.3p385 :011 > d.to_datetime.in_time_zone("Alaska")
=> Sat, 05 Jul 2014 06:30:00 AKDT -08:00 
1.9.3p385 :012 > to_datetime.in_time_zone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接