web-dev-qa-db-ja.com

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

ロサンゼルスの現在の時刻は18:05です。しかし、TZ=UTC-8 date --iso=nsを実行すると、次のようになります。

2013-12-07T10:05:37,788173835+0800

日付ユーティリティは、時刻が10:05であることを教えてくれ、さらにUTC + 8として報告しているとさえ言っています。どうして?

26
Alex Henrie

その理由は、TZ=UTC-8POSIXタイムゾーン として解釈されます。 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より進んでいることを示します。

33
cjm

+/- 00:00の形式でタイムゾーンを指定する場合は常に、実際のタイムゾーンではなく、offsetを指定しています。から GNU libcdocumentation (POSIX標準に準拠):

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

これが、予想とは逆になるように見える理由です。

7
jordanm

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(夏時間)が有効になっている可能性があるため、近くにあります。

2
user79743

別の方法として、コマンドzdumpを使用して、他のタイムゾーン+オフセットで現在の時刻を表示できます。

Zdumpは、コマンドラインで指定された各ゾーン名の現在の時刻を出力します。

同じ規則がタイムゾーンに適用されます。本初子午線の西側は「後ろ」、東側は「先」です。

$ zdump PST PST Sat Dec 7 03:25:27 2013 PST

このスクリプトを作成して、zdumpdateの使用に関心のあるタイムゾーンとオフセットのいくつかを示し、それらを比較できるようにしました。

$ 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

次に、それを実行すると、zdumpdateの比較を確認できます。

$ ./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)
1
slm