ロサンゼルスの現在の時刻は18:05です。しかし、実行するとTZ=UTC-8 date --iso=ns
、次のようになります:
2013-12-07T10:05:37,788173835+0800
日付ユーティリティは、時間が10:05であることを教えてくれ、さらにUTC + 8として報告していると言っています。どうして?
ロサンゼルスの現在の時刻は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から-8時間遅れた、またはUTC + 8時間である「UTC」と省略されたタイムゾーンを意味します。
(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 +
より進んでいることを示します。
TZ=America/Los_Angeles
です。夏時間の太平洋時間は-7であることを忘れています。
TZ=:America/Los_Angeles
です。コロンは、それがOlsonタイムゾーンファイルであることを示します。そして別のコメントで、彼は夏時間を無視したいと述べましたが、それはしません。
EST-5
CST-6
。
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 12月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
to の比較を見ることができます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)
TZ=PST+8 date
。ありがとう。私はこの説明も見つけましたman timezone
:「std文字列はタイムゾーンの名前を指定し、3文字以上のアルファベット文字である必要があります。 UTC)。オフセットは、ローカルタイムゾーンが子午線の西にある場合は正で、東の場合は負です。時は0〜24、分と秒は0〜59である必要があります。