How to get Rails to interpret a time as being in a specific time zone?
在Ruby1.8.7中,如何设置时间的时区?
在以下示例中,我的系统时区是pst(从UTC算起为-8:00小时)
给定一个时间(
1 2 3 4 5 6 7 | #this interprets the time as system time zone, i.e. PST Time.local(2011,02,21,20,45) #=> Mon Feb 21 20:45:00 -0800 2011 #this **converts** the time into EST, which is wrong! Time.local(2011,02,21,20,45).in_time_zone"Eastern Time (US & Canada)" #=> Mon, 21 Feb 2011 23:45:00 EST -05:00 |
但是,我想要的输出是:
我设法让它起作用,但我不喜欢:
1 2 3 4 5 6 7 8 9 10 | DateTime.new(2011,02,21,20,45).change :offset => -(300.0 / 1440.0) # => Mon, 21 Feb 2011 20:45:00 +0500 Where 300 = 5 hrs x 60 minutes 1440 = number of minutes in a day or the"right" way: DateTime.civil(2011,02,21,20,45,0,Rational(-5, 24)) |
问题:现在,有没有一种方法可以确定从
参考文献:
感谢@ctcherry的帮助!
从
1 | DateTime.civil(2011,02,21,20,45,0,Rational((Time.zone.tzinfo.current_period.utc_offset / 3600), 24)) |
在Ruby1.8.7中,按照文档的要求执行任务似乎并不容易:
http://www.ruby-doc.org/core-1.8.7/classes/time.html
但是在1.9中,通过将时区偏移量传递给时间对象的localTime()方法,看起来要容易得多:
http://www.ruby-doc.org/core/classes/time.html m000346
更新
时区的偏移很容易,因为它本身就是一个对象:(这是在Rails控制台中)
1 2 3 4 5 6 | ruby-1.8.7-p248 :001 > Time.zone => #<ActiveSupport::TimeZone:0x103150190 @current_period=nil, @name="Central Time (US & Canada)", @tzinfo=#<TZInfo::TimezoneProxy: America/Chicago>, @utc_offset=nil> ruby-1.8.7-p248 :002 > Time.zone.utc_offset => -21600 ruby-1.8.7-p248 :003 > Time.zone.formatted_offset =>"-06:00" |
所以我认为这将(几乎)实现你想要的:
1 2 3 4 5 | require 'time' t ="21 Feb 2011, 20:45" Time.parse(t) # => Mon Feb 21 20:45:00 -0700 2011 t +=" -05:00" # this is the trick Time.parse(t) # => Mon Feb 21 18:45:00 -0700 2011 |
它仍然基于您的系统时区返回时间,但实际时间是您正在寻找的正确时间。
顺便说一下,这是在1.8.7-p334上测试的。