> e = Event.first
> e.registration_start_utc #registration_start_utc is a datetime column
=> Sat, 23 Oct 2010 06:38:00 UTC +00:00
> e.registration_start_utc.utc?
=> true
> ActiveSupport::TimeZone.find_tzinfo("America/New_York").utc_to_local(e.registration_start_utc)
=> Sat, 23 Oct 2010 02:38:00 UTC +00:00
有关此问题的2个问题:
1)为什么最后一个输出显示“UTC” - 小时被转换(6 => 2),但仍然显示UTC。为什么不EST / EDT?
2)夏令时转换后纽约的偏移量从-4变为-5后会发生什么?数据库中的值不会改变,所以我的唯一结论是我的应用程序将开始显示“1:38”而不是正确的2:38?
我最关心的是#2。 #1更像是一种好奇心。
谢谢!
答案 0 :(得分:1)
2)utc_to_local
使用日期来确定哪个偏移是正确的,因此对于给定的日期,输出将始终相同。
您可以像这样测试:
t = Time.utc(2011,3, 14, 12)
# => 2011-03-14 12:00:00 UTC
t2 = Time.utc(2011,3, 11, 12)
# => 2011-03-11 12:00:00 UTC
ActiveSupport::TimeZone.find_tzinfo("America/New_York").utc_to_local(t)
# => 2011-03-14 08:00:00 UTC
ActiveSupport::TimeZone.find_tzinfo("America/New_York").utc_to_local(t2)
# => 2011-03-14 07:00:00 UTC
1)对我来说似乎也不对。我的猜测是他们只对小时,分钟等的实际值感兴趣...并忽略时区。
在任何情况下,您最好使用:
e.registration_start_utc.in_time_zone("Eastern Time (US & Canada)")
另见this question我刚问过......