在Ruby中,如何在任意时区为任意将来的时间创建UTC时间,该时间为DST(如果适用)



在调度方法中,我需要采用(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

相关内容

  • 没有找到相关文章

最新更新