正しいTZ

正しいTZ

Solarisでタイムゾーンオフセットを使用すると、dateコマンドで奇妙な動作が発生します。

>echo $TZ
MET
>date
Wed Mar 31 11:41:45 MEST 2021
>TZ=MET+24 date
Tue Mar 30 09:42:06 MET 2021
>TZ=MEST+24 date
Tue Mar 30 09:42:52 MEST 2021

TZがMETに設定されている場合は、日付出力にMESTが表示される理由と、TZ + 24が両方のタイムゾーンで24時間ではなく26時間オフセットを表示する方法です。

答え1

したがって、なぜこれが起こるのか理解したいと思います(単純化)。

$ TZ=MET date; TZ=MET+0 date
Tue 01 Jun 2021 06:00:00 AM MEST
Tue 01 Jun 2021 04:00:00 AM MET

METつまり、との差は2時間ですMET+0

この問題をデバッグする最も簡単な方法は、'+%z'書式を追加することです。結果の印刷に使用された日付オフセットを印刷し、問題のある場所をデバッグするのに役立ちます。

$ TZ=MET date "+%c %z"; TZ=MET+0 date "+%c %z"
Wed 31 Mar 2021 06:11:16 PM MEST +0200
Wed 31 Mar 2021 04:11:16 PM MET +0000

-2これは、日付がオフセットとオフセットの結果を印刷していることを示します+0

質問は次のとおりです。なぜ?

それはおそらく、TZの最初の形式がstd offset(TAG-03に似ていたからです)。POSIX リファレンス)の中商標標準領域の範囲を定義し、そのラベルに対するオプションのオフセットを提供します。欠落している場合はオフセットが想定されます+0

したがって、METをMETに設定nameし、オフセットを+ 0に設定しました。

証明する:

$ TZ=MET date "+%c %z"; TZ=METX+7:30 date "+%c %z"
Wed 31 Mar 2021 06:19:00 PM MEST +0200
Wed 31 Mar 2021 08:49:00 AM METX -0730

これ商標簡単です。印刷するタイムゾーン名。

そのようなラベルに使用されるオフセットは次のとおりです。 (-7:30質問なし)

METXそのようなラベルはどこにもなく、ラベルに7:30オフセットもないことが明らかになります。

これは、aがラベルと昨日のオフセットをMET+24使用してタイムゾーンの時間を印刷する理由を説明します(必要に応じて試してください)。MET+0+24+12

正しいTZ

私達はTZをテストできます説明する標準時間は7時間、夏時間は9時間です。MET-7MEST-9。テストするには、以下を印刷するためのfaketime(Solaris用にコンパイルする必要があります)が必要です。

$ # In January (no DST):
$ faketime "1/1/21 12:00" bash -c 'date -u; TZ=MET date "+%c %z"'; \
  faketime "1/1/21 12:00" bash -c 'TZ=MET-7MEST-9  date "+%c %z"'

Fri 01 Jan 2021 04:00:00 PM UTC
Fri 01 Jan 2021 05:00:00 PM MET +0100
Fri 01 Jan 2021 11:00:00 PM MET +0700

$ # In June (DST in effect)
$ faketime "6/1/21 12:00" bash -c 'date -u; TZ=MET date "+%c %z"'; \
  faketime "6/1/21 12:00" bash -c 'TZ=MET-7MEST-9  date "+%c %z"'

Tue 01 Jun 2021 04:00:00 PM UTC
Tue 01 Jun 2021 06:00:00 PM MEST +0200
Wed 02 Jun 2021 01:00:00 AM MEST +0900

これは私たちの分析を確認することだけです。 TZ値は次のように減らすことができます。MET-7MESTDSTの基本効果は時間を1時間増やすことだからです。また、METの実際のUTCオフセットは+1なので、TZは次のようにする必要があると判断できます。MET-1MEST。 dstマーカー(MET-1)が欠落している場合、dstオフセットは適用されません。

あなたのための時間目標の設定昨日(+24時間)以下を使用する必要があります。

TZ='MET+23MEST'

質問?

答え2

METだけでは明らかに中央ヨーロッパ標準時(=UTC+1時間)を参照し、3月最後の日曜日(今年3月28日)の夏時間制バージョン(UTC+2時間)に切り替えられ、DSTバージョンは次のように知られています。 。中央ヨーロッパ標準時の夏時間。したがって、「MET」は実際には「MET-1MEST」の略語として解釈される。 2時間の合計UTC差は、1時間タイムゾーンベースのUTCオフセットと1時間DSTオフセットで発生します。

これにより、このコマンドを入力したときのデフォルトのUTC時間が約09:42 UTCであることがわかります。

ただし、「MET + 24」を指定すると、「識別子METを使用して(現地時間)+ 24時間= UTC」になるようにUTCに変換する奇妙な時間帯です。 UTCを現地時間に変換するには、公式が逆の順序で適用されるため、「MET + 24タイムゾーンの現地時間」はUTC - 24時間または正確に前日のUTC時間です。

「MET+24」にはDSTルールがないため、DST変更は適用されません。

関連情報