2015-09-20 11 views
6

おそらく、夏時間のファンダメンタルズの理解が不足していることを示す不吉な質問ですが、タイトルごとに、Time.dst?は時間オブジェクトが本当に真実か偽か分かりますか?Ruby Time#dstはどのようにして表示されますか?

おそらく、これは日付とタイムゾーンの組み合わせで識別できる必要がありますが、タイムゾーンの低緯度が夏時間を使用しないため意味がありません。したがって、必ず#dstを認識するための場所が必要ですか? ?

私は何をしないのですか?

答えて

2

タイムゾーンと夏時間に対応するために、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には広範な解説と背景が含まれています。カレンダーの歴史に興味がある場合は、魅力的な読書です。

+0

うーん、良い仕事@Schwern、素晴らしい徹底的な答え。私たちの話として、オルソンのデータベースを見て、あなたとあなたの答えの時間の知識の礼儀のこの新しいフォントで喜んで私の太ももをこすりながら! :) – jbk

関連する問題