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

时间:2014-05-23 15:04:25

标签: ruby-on-rails ruby datetime time zone

我使用datetimepicker并且需要将从params获取的字符串日期时间保存到特定的用户相关时区中的日期时间。它将允许我将正确的UTC日期时间保存到数据库。

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 个答案:

答案 0 :(得分:5)

您可以使用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

<强>更新

您可以将字符串直接解析为时区(String应该已经在该时区中),如下所示:

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])

答案 1 :(得分:-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