2016-08-09 5 views
0

私はそれが実行されて応じて、どのマシン上1900-01-01 01:00:00 +0100 CETまたは1900-01-01 00:53:28 +0053 LMTのいずれかを返すの時間帯に関係のGoコードの問題、、、に走った:私は行くを除外することができましたどこからタイムゾーン情報を取得しますか?

https://play.golang.org/p/K3ceq1n1KI

差異の原因となるバージョン。 Goはどこからタイムゾーン情報を取得しますか?

+2

タイムゾーン情報データベースは、オペレーティングシステムによって提供されます。あなたはそのデータベースがどこから来たのか尋ねていますか? – JimB

+0

あなたが遭遇した問題に関する詳細をお知らせください。あなたの質問は、その情報なしでは、本当に明確ではありません。 – apxp

答えて

1

実際はそれに依存します。

time.LoadLocation()ソースとその上にあるコメントを確認します。

// LoadLocation looks in the directory or uncompressed zip file 
// named by the ZONEINFO environment variable, if any, then looks in 
// known installation locations on Unix systems, 
// and finally looks in $GOROOT/lib/time/zoneinfo.zip. 

をそして、あなたは、Unix/POSIXシステム(例えばLinux)の、上の適切な時間帯データファイルは、常に「知ら設置場所」で利用可能であることを心に留めておく必要があります。特に、それはこの言います。しかし、他のシステムにはそのような場所はありません。その結果、Windowsでは、LoadLocationゾーンはZONEINFOまたはGOROOTが正しく設定されていない限り、タイムゾーンを見つけることができず、代わりにデフォルトを使用します(メモリが正しければUTCです)。

しかし、上記で説明したLMTの問題は少し違っています。ご覧のとおり、LMTは正確なタイムゾーンではありません。例えば。 hereを参照してください。そして、私はそれがどこから来ているかを調べなかったが、あなたが変換している時にはまだタイムゾーンが確立されていなかったということに関係していると思われる。だから、代わりにその場所のLMTを計算しているようです。

たとえば、遊び場の例で年を1900から2000(または1905)に変更するだけでは、正しいタイムゾーン(CET)が設定されます。

マシンの違いについては、実際に導入される前に、タイムゾーンルールを定義する最も自然な方法が何であるかはかなり疑わしいと思います。その結果、一部のタイムゾーンデータベースでは、タイムゾーン内の最初のルールの開始時刻が省略されたり、過去のものにさらに拡張されるように調整されることが考えられます。代わりに他の人はLMTオフセットをそこに置く。 (それらのすべてではないにしてもほとんどが同じIANAデータベースから派生していますが)

異なるマシンでも同じ動作を確実にしたい場合は、独自のzoneinfo.zipとZONEINFO変数を設定すると役立ちます。

関連する問題