「date」がTZ環境変数を無視するのはなぜですか?

「date」がTZ環境変数を無視するのはなぜですか?

Ubuntu 18.04では、次の動作が発生しますdate

$ date --version | head -n1
date (GNU coreutils) 8.28
$ date
Вт окт  8 13:18:18 MSK 2019
$ TZ=UTC date
Вт окт  8 10:18:23 UTC 2019

今まではそんなに良くなった。しかし、今Raspbian 9でも同じことをしようとしています。

$ date --version | head -n1
date (GNU coreutils) 8.26
$ date
Tue Oct  8 13:18:50 MSK 2019
$ TZ=UTC date
Tue Oct  8 13:18:51 MSK 2019

dateRaspbianバージョンが環境変数を無視するのはなぜですかTZ

答え1

2つの考えられる理由を考えることができます。

  1. このファイルは/usr/share/zoneinfo/UTCRaspbian 9に存在しないか破損しているため、glibcTZ変数の設定とシステムのデフォルトタイムゾーンに置き換えることはできません。

  2. 読み取り専用としてマークされている以前に構成したTZ変数がある可能性があるため、これを変更しようとしても適用されません。

答え2

$TZ年間を通じて標準時(0からオフセット)のUTCと呼ばれるタイムゾーンを定義する正確で標準的で移植可能な方法は次のとおりです。

TZ=UTC0

これは独立しており、そのタイムゾーンの完全な仕様を提供します。これは、UTCからのオフセットが0(DST部分が指定されていないため、年間を通じて有効)であり、ラベル(報告されているようにdate +%Z)がUTCであることを示します。

説明されているタイムゾーンの仕様には、TZDST名とオフセットだけでなく、夏時間と冬時間の間の変更時期の規則も含まれるため、より複雑になる可能性があります。ただし、これらの規則は限られており、特に規則が毎年変わる状況は扱われません(そして、ほとんどの国では、規則は時間の経過とともに変わるか、特定の月の1日で使用されます。または最後)。日曜日(他の規則)。

そのため、POSIXは、実装が実際のタイムゾーンを定義するより良い方法を見つけることができるように、左の実装定義を処理するTZ=:something方法も指定します。something

ほとんどのシステムでは、これは次のように行われます。ICANNのtzデータベース(また、これらの問題を処理する参照コードも公開します。)

TZ=:Europe/Londonたとえば、今年と過去数年間で、ロンドンのタイムゾーンオフセットと変更時間をカバーする英国大陸タイムゾーンを使用できます。

実際には、一部のディレクトリ(通常は)Europe/Londonへの相対ファイルパスとして解釈されます。zoneinfo/usr/share/zoneinfo

Etc/UTCtzデータベースには、ファイルEtc/Universalとそのリンクを含むファイルもありますEtc/ZuluEtc/GMT同じ方法で定義されますが、ラベルは年間を通してGMTです(、、Etc/GMT-0リンクを使用)。Etc/GMT+0Etc/Greenwich

したがって、システムが最も単純なTZ規則(年間を通じてUTCから0オフセット)を見つけるためにファイルを開く必要があることを除いて、TZ=:Etc/UTCUTCと同じ効果が得られます。TZ=UTC0Etc/UTC

UTC多くの(ほとんど?)システムには - >シンボリックリンクがあるため、Etc/UTCこれを実行できますTZ=:UTC

TZ=UTCPOSIX自体ではありませんが、オフセットがない場合は、ほとんどのシステムで同じように解釈されますTZ=:UTC(でタイムゾーン定義を見つけます/path/to/zoneinfo/UTC)。しかし、tzデータベースが利用できない場合は動作しません。

また、特にこのオプションを使用すると、コンテンツに関係なくUTC日付を取得dateできます。 .​-u$TZdate -uTZ=UTC0 date

関連情報