おそらく、夏時間のファンダメンタルズの理解が不足していることを示す不吉な質問ですが、タイトルごとに、Time.dst?
は時間オブジェクトが本当に真実か偽か分かりますか?Ruby Time#dstはどのようにして表示されますか?
おそらく、これは日付とタイムゾーンの組み合わせで識別できる必要がありますが、タイムゾーンの低緯度が夏時間を使用しないため意味がありません。したがって、必ず#dstを認識するための場所が必要ですか? ?
私は何をしないのですか?
おそらく、夏時間のファンダメンタルズの理解が不足していることを示す不吉な質問ですが、タイトルごとに、Time.dst?
は時間オブジェクトが本当に真実か偽か分かりますか?Ruby Time#dstはどのようにして表示されますか?
おそらく、これは日付とタイムゾーンの組み合わせで識別できる必要がありますが、タイムゾーンの低緯度が夏時間を使用しないため意味がありません。したがって、必ず#dstを認識するための場所が必要ですか? ?
私は何をしないのですか?
タイムゾーンと夏時間に対応するために、Rubyは他のすべてのものと同様に、callinglocaltime_r
C functionです。これは、isdst
というフィールドを含むtm
という名前のC構造体に時間を入れます。 Rubyはその旗を読んでいる。
localtime_r
は、グローバルtzname
変数からタイムゾーンを取得することによって、最初にisdst
を計算します。 は、tzset
を呼び出すことによって決定されます。 tzset
の仕事はシステムに依存します。これは、TZ環境変数から来て、ファイルを読み込んだり、OSサービスに問い合わせたりすることができます。
たとえば、
# Time zone from the system.
$ ruby -e 'puts Time.now.zone; puts Time.now.dst?'
PDT
true
# Time zone from the TZ environment variable.
$ TZ='Australia/Brisbane' ruby -e 'puts Time.now.zone; puts Time.now.dst?'
AEST
false
それは時間帯、localtime_r
は"tz database"別名「のtzdata」別名「zoneinfoの」別名「オルソンデータベースを使用して(その日に適用されるルールを使用して)所望の時間帯にGMTへ変換することができるが有すると"その創作者アーサー・デイビッド・オルソンの後に。以前は私的な努力をしていましたが、これは現在IANAによって維持されています。あなたのシステムにインストールされているか、またはFar More Than Everything You Ever Want To Know About Time Zones and Daylight Savingsを含むRubyに同梱されている一連のファイルです。
tzデータベースtreats daylight savings (and other weird things like War and Peace time) as just another time zone。時間帯の記録は、私たちがタイムゾーンを持っている限り、元の状態に戻っています。時間帯がある前に、その場所のsolar noonが使用されています。これらの歴史的な複雑さとタイムゾーンの移行のために、tzデータベースはwork with cities (such as "America/New York")を好み、あなたのタイムゾーンを決定します。
time zone data filesには広範な解説と背景が含まれています。カレンダーの歴史に興味がある場合は、魅力的な読書です。
ルビー2.2.0 Time.dst?
methodはを参照time_isdst(...)
functiontime.c
中:
struct tm tm_isdt
memberに対応しているようだ
// ...
return tobj->vtm.isdst ? Qtrue : Qfalse
:
int tm_isdst daylight savings flag
検索time.c
の中tm_isdst
ためとisdst
それがどのように計算されるかについて読むこと。
うーん、良い仕事@Schwern、素晴らしい徹底的な答え。私たちの話として、オルソンのデータベースを見て、あなたとあなたの答えの時間の知識の礼儀のこの新しいフォントで喜んで私の太ももをこすりながら! :) – jbk