在调度方法中,我需要取一个(local_date、local_time 和 local_time_zone),并返回相应的 UTC 时间,以说明夏令时是否在该日期生效。
我不想更改 Time.zone ,因为虽然线程安全,但它具有跨多个请求持续存在的完全出乎意料的结果 - 一件坏事。
以下(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 方法会考虑夏令时是否有效,但事实并非如此。
我不确定是否应该使用 Time 对象、DateTime 对象和 TimeWith Zone 等。
===
注意:有一种方法可以使用 Chronic gem(如下)。但我想使用内置的 Ruby 日期和时间方法来获得相同的(例如,正确的)结果:
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