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


25

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

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

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

回答:


33

理由はTZ=UTC-8POSIXタイムゾーンとして解釈されることです。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=PST+8 date。ありがとう。私はこの説明も見つけましたman timezone:「std文字列はタイムゾーンの名前を指定し、3文字以上のアルファベット文字である必要があります。 UTC)。オフセットは、ローカルタイムゾーンが子午線の西にある場合は正で、東の場合は負です。時は0〜24、分と秒は0〜59である必要があります。
アレックスヘンリー

3
@Alexいいえ、本当に欲しいのはTZ=America/Los_Angelesです。夏時間の太平洋時間は-7であることを忘れています。
マットジョンソン-パイント

3
@MattJohnson、という意味TZ=:America/Los_Angelesです。コロンは、それがOlsonタイムゾーンファイルであることを示します。そして別のコメントで、彼は夏時間を無視したいと述べましたが、それはしません。
cjm

@cjm、ありがとう、あなたはコロンについて正しいです、そして私はそのコメントを見ませんでした。
マットジョンソン-パイント

アメリカ、私たちがそうしなければならないことを意味するなら、世界を引き起こしなさいEST-5 CST-6
エヴァンキャロル

7

+/- 00:00の形式でタイムゾーンを指定すると、実際のタイムゾーンではなく、offsetを指定します。以下からのGNU libc ドキュメント(POSIX標準に従っ):

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

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


2

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, ChinaPerth, 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(夏時間)が有効な場合があるため。


1

別の方法として、コマンド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

それを実行すると、zdumpto の比較を見ることができます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)

実際、夏時間を無視して、太平洋標準時で現在の時刻を取得しようとしています。
アレックス・ヘンリー

1
あなたが「UTC-8」が間違っていると推測しているので、私はこれをダウン投票しなければなりませんでした。それは正しいです、ユーザーが期待することをしないだけです。私はそれがなぜそのように機能するのかという質問に答えるとは思わない。
ヨルダン

@jordanm-クリーンアップを参照してください。
slm

1
何が起こっているのかはまだ説明されていますが、理由ではなく、「理由」がOPが求めているものです。私は下票を削除しますが、それが質問に対する良い答えだとはまだ感じていません。
ヨルダン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.