TZ = UTC-8がUTC + 8の日付を生成するのはなぜですか?



Why Does Tz Utc 8 Produce Dates That Are Utc 8



解決:

その理由はTZ = UTC-8は、POSIXタイムゾーンとして解釈されます。 POSIXタイムゾーン形式では、3文字はタイムゾーンの省略形(任意)であり、数値はタイムゾーンの時間数です。 後ろ UTC。そうUTC-8は、実際のUTCより-8時間遅れている、つまりUTC +8時間である「UTC」と省略されたタイムゾーンを意味します。

(UnixはUTCに遅れをとっている米国で開発されたため、このように機能します。この形式では、米国のタイムゾーンをEST5、CST6などとして表すことができます。)



これらの例で、それが起こっていることがわかります。

$ TZ =UTC-8日付+ '%Z%z' UTC +0800 $ TZ =UTC8日付+ '%Z%z' UTC -0800 $ TZ =FOO-8日付+ '%Z%z' FOO +0800

ISO-0800タイムゾーン形式は、逆のアプローチを取ります。-ゾーンがUTCの背後にあることを示し、+ゾーンがUTCより進んでいることを示します。




+/- 00:00の形式でタイムゾーンを指定する場合は常に、 オフセット 、実際のタイムゾーンではありません。からGNU libcドキュメント(POSIX標準に準拠):

オフセットは、協定世界時の値を取得するために現地時間に追加する必要のある時間値を指定します。 [+ |-] hh [:mm [:ss]]のような構文があります。これは、ローカルタイムゾーンが本初子午線の西にある場合は正であり、東にある場合は負です。時間は0から23の間、分と秒は0から59の間でなければなりません。

これが、あなたが期待するものの逆であるように見える理由です。




どうして?

POSIXがそれを必要とするからです。

'-'が前に付いている場合、タイムゾーンは本初子午線の東になります。それ以外の場合は、西になります(オプションの先行する「+」で示される場合があります)。

だから、これは近くの時間を与えるでしょう[1] ロサンゼルス(タイムゾーンテキスト用の3文字のラベル付き):

$ TZ =ANY8日付 '+%Y-%m-%d%H:%M:%S%Z%z' 2016-04-23 10:47:12 ANY-0800 $ TZ = GMT + 8日付 '+ %Y-%m-%d%H:%M:%S%Z%z '2016-04-23 10:47:12 GMT-0800

そして、これは近くの時間を与えるはずです上海、中国またはオーストラリア、パース:

$ TZ =ANY-8日付 '+%Y-%m-%d%H:%M:%S%Z%z' 2016-04-24 02:47:12 ANY + 0800 $ TZ =CST-8日付'+%Y-%m-%d%H:%M:%S%Z%z' 2016-04-23 02:47:12 CST + 0800

[1]実際の「現地時間」をシフトするDST(夏時間)が有効になっている可能性があるため、近くにあります。