ロサンゼルスの現在の時刻は18:05です。しかし、TZ=UTC-8 date --iso=ns
を実行すると、次のようになります。
2013-12-07T10:05:37,788173835+0800
日付ユーティリティは、時刻が10:05であることを教えてくれ、さらにUTC + 8として報告しているとさえ言っています。どうして?
その理由は、TZ=UTC-8
は POSIXタイムゾーン として解釈されます。 POSIXタイムゾーン形式では、3文字はタイムゾーンの省略形(任意)であり、数字はタイムゾーンが遅れている時間数UTCです。そう UTC-8
は、「UTC」と略記されたタイムゾーンであり、実際のUTCから-8時間、またはUTC + 8時間遅れています。
(UnixはUTCの背後にある米国で開発されたため、この方法で機能します。この形式では、米国のタイムゾーンをEST5、CST6などとして表すことができます。)
これらの例では、それが起こっていることがわかります。
$ TZ=UTC-8 date +'%Z %z'
UTC +0800
$ TZ=UTC8 date +'%Z %z'
UTC -0800
$ TZ=FOO-8 date +'%Z %z'
FOO +0800
ISO -0800
タイムゾーン形式は、-
は、ゾーンがUTCの背後にあることを示し、+
は、ゾーンがUTCより進んでいることを示します。
+/- 00:00の形式でタイムゾーンを指定する場合は常に、実際のタイムゾーンではなく、offsetを指定しています。から GNU libc
documentation (POSIX標準に準拠):
オフセットは、協定世界時の値を取得するために現地時間に追加する必要がある時間値を指定します。 [+ |-] hh [:mm [:ss]]のような構文です。ローカルタイムゾーンが本初子午線の西側の場合は正、東側の場合は負になります。時間は0から23の間、分と秒は0から59の間でなければなりません。
これが、予想とは逆になるように見える理由です。
Why?
なぜなら POSIXはそれを必要とする だからです。
「-」が前に付いている場合、タイムゾーンは子午線の東になります。それ以外の場合は、西向きになります(オプションの先行 '+'で示される場合があります)。
だから、これは近くに時間を与えるでしょう[1]Los Angeles
(タイムゾーンテキストの3文字のラベル付き):
$ TZ=ANY8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-23 10:47:12 ANY-0800
$ TZ=GMT+8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-23 10:47:12 GMT-0800
そして、これはShanghai, China
またはPerth, Australia
:
$ TZ=ANY-8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-24 02:47:12 ANY+0800
$ TZ=CST-8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-23 02:47:12 CST+0800
[1]実際の「現地時間」をシフトするDST(夏時間)が有効になっている可能性があるため、近くにあります。
別の方法として、コマンドzdump
を使用して、他のタイムゾーン+オフセットで現在の時刻を表示できます。
Zdumpは、コマンドラインで指定された各ゾーン名の現在の時刻を出力します。
同じ規則がタイムゾーンに適用されます。本初子午線の西側は「後ろ」、東側は「先」です。
$ zdump PST PST Sat Dec 7 03:25:27 2013 PST
このスクリプトを作成して、zdump
とdate
の使用に関心のあるタイムゾーンとオフセットのいくつかを示し、それらを比較できるようにしました。
$ cat cmd.bash
#!/bin/bash
printf "\ndate: %s\n\n" "$(date)"
for tz in EST PST PST+8 PST-8 UTC UTC+8 UTC-8; do
echo "-- timezone $tz"
printf "zdump: %s\n" "$(zdump $tz)"
printf "date: %s\n" "$(TZ=$tz date +'%a %b %d %T %Y - (%Z %z)')"
echo ""
done
次に、それを実行すると、zdump
とdate
の比較を確認できます。
$ ./cmd.bash
date: Sat Dec 7 02:59:05 EST 2013
-- timezone EST
zdump: EST Sat Dec 7 02:59:05 2013 EST
date: Sat Dec 07 02:59:05 2013 - (EST -0500)
-- timezone PST
zdump: PST Sat Dec 7 07:59:05 2013 PST
date: Sat Dec 07 07:59:05 2013 - (PST +0000)
-- timezone PST+8
zdump: PST+8 Fri Dec 6 23:59:05 2013 PST
date: Fri Dec 06 23:59:05 2013 - (PST -0800)
-- timezone PST-8
zdump: PST-8 Sat Dec 7 15:59:05 2013 PST
date: Sat Dec 07 15:59:05 2013 - (PST +0800)
-- timezone UTC
zdump: UTC Sat Dec 7 07:59:05 2013 UTC
date: Sat Dec 07 07:59:05 2013 - (UTC +0000)
-- timezone UTC+8
zdump: UTC+8 Fri Dec 6 23:59:05 2013 UTC
date: Fri Dec 06 23:59:05 2013 - (UTC -0800)
-- timezone UTC-8
zdump: UTC-8 Sat Dec 7 15:59:05 2013 UTC
date: Sat Dec 07 15:59:05 2013 - (UTC +0800)