2014-05-23 236 views
2

我使用的是datetimepicker,並且需要將從params獲取的字符串datetime保存到特定的用戶相關時區中的日期時間。它將允許我將正確的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) 

回答

3

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

UPDATE

您可以直接將字符串解析爲時區(wh ERE字符串應該已經在該時區)是這樣的:

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

已經嘗試過這種方式,但那不是我意味着要做。 to_datetime將字符串轉換爲UTC(因此無論如何它都是14:30)。在調用in_time_zone('華沙')後,它給了我'週六,2014年7月5日16:30:00 CEST +02:00'這是錯誤的 - 我需要'星期六,2014年7月5日14:30:00 CEST +02:00 '。 – Jacka

+0

啊,我明白了。更新了我的答案。看看是否有效。 – pdobb

+0

是的,就是這樣,只是想出了自己,但謝謝你的正確答案:) – Jacka

0

試試這個: -

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 
相關問題