2

スケジューリング メソッドでは、(local_date、local_time、および local_time_zone) を取得し、対応する utc 時間を返す必要があります。これは、その日に夏時間が有効かどうかを説明するものです。

私は Time.zone を変更したくありません。なぜなら、スレッドセーフではあるものの、複数のリクエストにまたがって保持されるというまったく予想外の結果になるからです。これは悪いことです。

次の (0800 太平洋時間) は機能しません。最初の日 (10 月 1 日) は夏時間で、2 日目 (12 月 1 日) は夏時間ではありませんが、UTC (16:00) で同じ時刻を返すためです。時刻なので、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 の Date および Time メソッドを使用して、同じ (たとえば、正しい) 結果を取得したいと考えています。

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 
4

2 に答える 2

1

別の SO スレッドで見つけました: 秘訣は、時間 (およびゾーン) を Time.parse で使用できる形式にすることです。

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

いろいろ試した結果、特定のゾーンで時間を作成するために Time.zone を変更することに慎重になったのは正しかったようです。Time.zone を設定すると、(同じスレッドで) 複数のリクエストに「固執」する可能性があります。そのため、Rails アプリに対して 2 つの異なるウィンドウを開いて、2 つの異なるアカウントを表示している場合、一方のウィンドウでアカウントの Time.zone を設定すると、実際には他方のアカウントの別のウィンドウで Time.zone を変更できます。

于 2012-11-05T07:16:14.553 に答える
0

私は最近、似たようなことを経験し、Time.zone.localが夏時間を考慮してうまく機能することを発見しました。米国の夏時間についてはよくわかりませんが、ここオーストラリアでは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 

日付/タイムゾーンが正しいことを確認しますか?このページによると、太平洋時間は11月に夏時間を経験しているようです: http ://www.timeanddate.com/worldclock/timezone.html?n = 137

于 2012-11-05T04:01:40.483 に答える