1

私は ActiveSupport の 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 時に 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 に答える