在调度方法中,我需要采用(local_date,local_time和local_time_zone),然后返回相应的UTC Time Accounting ,以供日光保存时间是否为在上有效 date。
我不想更改时间。区域,因为当螺纹安全时,它具有持续多个请求的持续存在的完全出乎意料的结果 - 这是一件坏事。
以下(0800太平洋时间)不起作用,因为它们在UTC(16:00)的同一时间即使第一天(10月1日)在日光节省时间,第二天(12月1日)不是在日光节省时间,因此UTC应不同
Time.new(2012, 10, 1, 8, 0, 0, ActiveSupport::TimeZone['Pacific Time (US & Canada)'].utc_offset).utc
# 2012-10-01 16:00:00 UTC <<<< should be 15:00
Time.new(2012, 12, 1, 8, 0, 0, ActiveSupport::TimeZone['Pacific Time (US & Canada)'].utc_offset).utc
# 2012-12-01 16:00:00 UTC
我曾经希望.utc方法能够考虑到日光节省是否有效,但事实并非如此。
我不确定是否应该使用时间对象,DateTime对象和时间对象等。
===
注意:使用慢性宝石(下图)有一种方法。但是我想使用内置的红宝石日期和时间方法来获得相同的结果(例如,正确)结果:
Chronic.time_class =ActiveSupport::TimeZone["Pacific Time (US & Canada)"]
Chronic.parse("10/1/2012 0800").utc
# 2012-10-01 15:00:00 UTC
Chronic.parse("12/1/2012 0800").utc
# 2012-12-01 16:00:00 UTC
在另一个so线程上找到它:诀窍是将时间(和区域)放入可按时间使用的格式。
Time.parse("2012-10-1 8:00:00 Pacific Time (US & Canada)").utc
# 2012-10-01 15:00:00 UTC
Time.parse("2012-12-1 8:00:00 Pacific Time (US & Canada)").utc
# 2012-12-01 16:00:00 UTC
另一种方法(可能更好):
ActiveSupport::TimeZone["Pacific Time (US & Canada)"].parse("2012-12-1 8am").utc
在周围玩耍后,似乎我们要警惕更改时间。区域只是在特定区域中创建时间 - 设置时间。区域可以在多个请求上"粘贴"(在同一线程中)。因此,如果您有两个向Rails应用开放的窗口,并且正在查看两个不同的帐户,则设置时间。一个窗口中的帐户的区域实际上可以更改时间。另一个帐户的另一个窗口中的区域。
我最近经历了类似的东西并找到了时间。我不确定我们的日光节省,但是在澳大利亚的日光节省在2013年10月6日开始。
以下代码似乎对我有效:
1.9.3-p194 :009 > Time.zone = 'Sydney'
=> "Sydney"
1.9.3-p194 :010 > Time.zone.local(2013, 10, 1, 0, 0, 0).utc
=> 2013-09-30 14:00:00 UTC
1.9.3-p194 :011 > Time.zone.local(2013, 10, 10, 0, 0, 0).utc
=> 2013-10-09 13:00:00 UTC
您确定您的日期/时区是否正确?似乎Pacific Time经历了11月的日光节省,根据此页面:http://www.timeanddate.com/worldclock/timezone.html?n=137