1

我正在使用 ActiveSupport 的 Timezone 类来查找 Timezone 的偏移量,就像这样。

novdate = Date.new(2012,11,04)
offset_in_seconds = ActiveSupport::TimeZone['Eastern Time (US & Canada)'].at(novdate.to_time.midnight+3.hours).utc_offset

问题是 offset_in_seconds 在我的本地机器和 heroku 服务器上是不同的。我不确定为什么会这样。我在我的 rails application.rb 文件中设置了 config.time_zone = 'Eastern Time (US & Canada)' 。如何准确一致地获得给定日期的时区偏移量?我一直在上面的时间上增加 3 个小时,因为时间应该在给定日期的凌晨 3:00 从 DST 更改为非 DST。

-- 从我的本地 rails 控制台显示 --

novdate = Date.new(2012,11,04)
ActiveSupport::TimeZone['Eastern Time (US & Canada)'].at(novdate.to_time.midnight+1.hours)
 => Sun, 04 Nov 2012 01:00:00 EDT -04:00 
ActiveSupport::TimeZone['Eastern Time (US & Canada)'].at(novdate.to_time.midnight+2.hours)
 => Sun, 04 Nov 2012 01:00:00 EST -05:00 
ActiveSupport::TimeZone['Eastern Time (US & Canada)'].at(novdate.to_time.midnight+3.hours)
 => Sun, 04 Nov 2012 02:00:00 EST -05:00 

-- heroku rails 控制台的输出 ---

ActiveSupport::TimeZone['Eastern Time (US & Canada)'].at(novdate.to_time.midnight+4.hours)
=> Sun, 04 Nov 2012 00:00:00 EDT -04:00
ActiveSupport::TimeZone['Eastern Time (US & Canada)'].at(novdate.to_time.midnight+5.hours)
=> Sun, 04 Nov 2012 01:00:00 EDT -04:00
ActiveSupport::TimeZone['Eastern Time (US & Canada)'].at(novdate.to_time.midnight+6.hours)
=> Sun, 04 Nov 2012 01:00:00 EST -05:00
4

1 回答 1

2

这里的问题是使用该语法的to_time方法date不会尊重您的时区。

如果您查看文档,to_time您可以看到它将其转换为服务器的本地时间。

Heroku 服务器可能为您的本地计算机配置了不同的时区(注意这不是config.time_zone设置)

这应该有效:

[24] pry(main)> Time.use_zone('Eastern Time (US & Canada)') {
[24] pry(main)*   novdate.to_time_in_current_zone()  
[24] pry(main)* }  
=> Sun, 04 Nov 2012 00:00:00 EDT -04:00
[25] pry(main)> 
于 2012-11-09T17:10:48.803 回答