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
date
Raspbianバージョンが環境変数を無視するのはなぜですかTZ
?
答え1
2つの考えられる理由を考えることができます。
このファイルは
/usr/share/zoneinfo/UTC
Raspbian 9に存在しないか破損しているため、glibc
TZ変数の設定とシステムのデフォルトタイムゾーンに置き換えることはできません。読み取り専用としてマークされている以前に構成したTZ変数がある可能性があるため、これを変更しようとしても適用されません。
答え2
$TZ
年間を通じて標準時(0からオフセット)のUTCと呼ばれるタイムゾーンを定義する正確で標準的で移植可能な方法は次のとおりです。
TZ=UTC0
これは独立しており、そのタイムゾーンの完全な仕様を提供します。これは、UTCからのオフセットが0(DST部分が指定されていないため、年間を通じて有効)であり、ラベル(報告されているようにdate +%Z
)がUTCであることを示します。
説明されているタイムゾーンの仕様には、TZ
DST名とオフセットだけでなく、夏時間と冬時間の間の変更時期の規則も含まれるため、より複雑になる可能性があります。ただし、これらの規則は限られており、特に規則が毎年変わる状況は扱われません(そして、ほとんどの国では、規則は時間の経過とともに変わるか、特定の月の1日で使用されます。または最後)。日曜日(他の規則)。
そのため、POSIXは、実装が実際のタイムゾーンを定義するより良い方法を見つけることができるように、左の実装定義を処理するTZ=:something
方法も指定します。something
ほとんどのシステムでは、これは次のように行われます。ICANNのtzデータベース(また、これらの問題を処理する参照コードも公開します。)
TZ=:Europe/London
たとえば、今年と過去数年間で、ロンドンのタイムゾーンオフセットと変更時間をカバーする英国大陸タイムゾーンを使用できます。
実際には、一部のディレクトリ(通常は)Europe/London
への相対ファイルパスとして解釈されます。zoneinfo
/usr/share/zoneinfo
Etc/UTC
tzデータベースには、ファイルEtc/Universal
とそのリンクを含むファイルもありますEtc/Zulu
。Etc/GMT
同じ方法で定義されますが、ラベルは年間を通してGMTです(、、Etc/GMT-0
リンクを使用)。Etc/GMT+0
Etc/Greenwich
したがって、システムが最も単純なTZ規則(年間を通じてUTCから0オフセット)を見つけるためにファイルを開く必要があることを除いて、TZ=:Etc/UTC
UTCと同じ効果が得られます。TZ=UTC0
Etc/UTC
UTC
多くの(ほとんど?)システムには - >シンボリックリンクがあるため、Etc/UTC
これを実行できますTZ=:UTC
。
TZ=UTC
POSIX自体ではありませんが、オフセットがない場合は、ほとんどのシステムで同じように解釈されますTZ=:UTC
(でタイムゾーン定義を見つけます/path/to/zoneinfo/UTC
)。しかし、tzデータベースが利用できない場合は動作しません。
また、特にこのオプションを使用すると、コンテンツに関係なくUTC日付を取得date
できます。 .-u
$TZ
date -u
TZ=UTC0 date