私のシステム(Debian TestingのGnome 3)は現在の時刻について混乱しています。 date
を実行すると、時刻は正しく表示されますが、一部のアプリケーションは1時間遅れています。たとえば、Gnomeカレンダーにイベントを追加すると、カレンダーの予定に表示されるイベント時間は、入力した時間から1時間を引いたものになります。
私は問題が何であるかを見つけましたが、それを解決する方法がわかりません:
$ date ; TZ=GMT date ; TZ=BST date
Sun 30 Apr 11:25:37 BST 2017
Sun 30 Apr 10:25:37 GMT 2017
Sun 30 Apr 10:25:37 BST 2017
出力の最初の2行は正しく、3行目は1時間遅れています。私が理解できないのは、BSTタイムゾーンが1時間遅れているように見えるのに、現在の時刻が正しく、BSTを使用している理由です。
これも関連している可能性があります。
$ timedatectl status
Local time: Sun 2017-04-30 11:33:07 BST
Universal time: Sun 2017-04-30 10:33:07 UTC
RTC time: Sun 2017-04-30 10:33:07
Time zone: Europe/London (BST, +0100)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no
編集 zdump/etc/localtimeの出力:
$ zdump /etc/localtime
/etc/localtime Sun Apr 30 12:22:53 2017 BST
$ date ; TZ=GMT date ; TZ=BST date
Sun 30 Apr 12:22:53 BST 2017
Sun 30 Apr 11:22:53 GMT 2017
Sun 30 Apr 11:22:53 BST 2017
Gillesの回答を補完する。 OPと同じタイムゾーンにいます。西ヨーロッパ時間(WET
)は正式な名称です。メモリに問題がなければ、1996年頃のUnixタイムゾーンのポルトガルに含まれていました。
https://en.wikipedia.org/wiki/Western_European_Time
ヨーロッパ時間(WET、UTC±00:00)は、西ヨーロッパおよび北西ヨーロッパの一部をカバーするタイムゾーンです。
次の国と地域では、冬季にWETを使用します。
-カナリア諸島、> 1946年以降(スペインの残りはCET、UTC + 1)-フェロー諸島、1908年以降
-北東グリーンランド(デンマークとその周辺)
-アイスランド、1968年以来
-ポルトガル、1912年以降、一時停止あり(アゾレス、UTC-1を除く)[1]
-マデイラ諸島、1912年以降、一時停止あり[2]
-アイルランド、1968年から1971年までを除いて1916年から(正式にはグリニッジ標準時として知られています)
-イギリスとクラウンの依存関係、1847年以降のイングランド、スコットランド、ウェールズ、チャネル諸島、マン島、および1916年以降の北アイルランド(正式にはグリニッジ標準時として知られています)、一時停止ありイギリスでは、1940年から1945年までのイギリスの夏時間(BST = CET)が冬に使用され、1941年から1945年まで、そして1947年のイギリスの夏時間(BDST = CEST)が夏に使用されました。 1968年2月18日から1971年10月31日まで、BSTは一年中使用されました。
アイスランドを除く上記の国はすべて夏時間に夏時間を実装し、西ヨーロッパ夏時間(WEST、UTC + 1)に切り替えます。これはWETより1時間進んでいます。 WESTは英国では英国夏時間と呼ばれ、正式にはアイルランドではアイルランド標準時として知られています。
夏時間の公式名称はWEST(西ヨーロッパ夏時間)ですが、WET
はTZ
に使用され、夏時間/ DSTを考慮して1時間進みます。
「ヨーロッパ/ロンドン」の方が良い選択かもしれませんが、WET
省略形を知っていることは、状況によってはまだ役に立ちます。
https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
したがって、結果を最初のテストと比較するには:
$date ; TZ=GMT date ; TZ=WET date
Mon May 1 09:36:10 WEST 2017
Mon May 1 08:36:10 GMT 2017
Mon May 1 09:36:10 WEST 2017
BST
はタイムゾーン名として認識されません。出力の省略形として使用されますが、タイムゾーンの指定には使用できません。ほとんどのプログラムはタイムゾーン名をチェックせず、タイムゾーン名が認識されない場合は黙ってデフォルトでGMTに設定されます。
BST、CET、ESTなどの省略形は、必ずしも明確に定義されているわけではなく、あいまいな場合もあります(北米またはオーストラリアの東部標準時ですか?)。これらは特定の地域でのみ意味がありますが、タイムゾーン構成は通常、世界中で使用することを目的としています。さらに、BSTのような略語は実際にはタイムゾーンを指定するのではなく、年の一部の特定のタイムゾーンにある時間のみを示します(夏時間が有効なイギリス)。したがって、明確な指定を使用する必要があります。そのほとんどは大陸/都市のパターンに従います。典型的なLinuxシステム、および他の多くのUnixバリアントでも、ディレクトリ/usr/share/zoneinfo
を調べることで、使用可能な略語を確認できます。
したがって、冬にはGMT
を使用し、夏にはBST
を使用する代わりに、Europe/London
を使用します。
@Gillesが言ったように、BSTはdate
/_date +%Z
_に出力されるものであり、英国夏時間の日付(つまりGMT + 1)であることをタイムゾーンを定義するものではなく、使用できるものではないことをユーザーに伝えます_$TZ
_の場合。
そのBSTはイギリスのユーザーにとって重要です。イギリスのユーザーが_14:00 BST
_を見ると、タイムスタンプがイギリス本土の夏時間の14:00(つまり13:00 UTC)を指していることがわかります。これらの3〜4文字のコードの使用はイギリス、アメリカ、およびその他の英語圏の国々で広く行われているため、date
のデフォルトの出力(たとえば、_en_GB.UTF-8
_ロケール)に表示されます。一方、ほとんどのフランスのユーザーは、_14:00 CEST
_の意味がわかりません(CEST
は中央ヨーロッパ夏時間、夏に適用されるGMT + 2を指します)フランスでは)、日付がタイムゾーンを指定する場合、CET
/CEST
ではなくUTCオフセットが含まれることに注意してください(mardi 2 mai 2017, 13:34:09 (UTC+0200)
など)。
_$TZ
_変数は、これらの3〜4文字のコードを含むことを意図していません。 defines/specifysタイムゾーン、現在の地域です。アプリケーションはこれを使用してUTCでのオフセットを認識します任意の時点で、冬時間と夏時間を切り替えるタイミングと、冬時間と夏時間のコード(存在する場合)がユーザーに表示される内容(重要なユーザー)。
そのためには、TZ
をシステム定義のタイムゾーン指定に設定できます。 _TZ=:Europe/London
_のように(ただし、多くのシステムは_TZ=Europe/London
_も受け入れます)、またはTZ
に完全なルールを含めます(これらのルールは制限されています)。
たとえば、システムで_TZ=:Europe/London
_を使用すると、ルールは_/usr/share/zoneinfo/Europe/London
_から読み取られます。
そのファイルは、たとえば1996年以降、UTCからのオフセットが10月の最後の日曜日の午前2時(UTC)から3月の最後の日曜日まで(「グリニッジ標準時」の名前はGMT)、0はそれ以外(BSTという名前)であることを指定します。 「ブリティッシュサマータイム」の場合)、1970年(0 Unix時間)から1972年までは、「BritishStandardTime」の名前はBSTで、通年1でした。
タイムゾーン仕様としてBSTを使用しても意味がないことがすでにおわかりでしょう。最初に、それは異なる時点で異なることを意味し、現在のエポックのみを考慮しても、それは夏時間のコードにすぎないため、通年のタイムゾーン仕様として使用することはできません。
これで、TZ
に完全なルールを含めることもできます。たとえば、70年代前半の「英国標準時(夏ではありません)」の場合、最も単純な形式の指定を使用できます。
_TZ=BST-1
_
これは、常にUTCの1時間東にあり、_date +%Z
_が常にBST
を返すタイムゾーンを指定します。そのタイムゾーンは、70年代前半のイギリス本土と1972年以降の夏時間には当てはまりますが、1972年以降の冬時間には当てはまりません(将来についてはわかりません)。
または、現在のルールの完全な仕様を使用できます。
_TZ=GMT0BST,M3.5.0/1:00:00,M10.5.0/2:00:00
_
つまり、1年に2つの期間があり、1つはオフセット0のGMTで、もう1つはオフセット1のBSTです(指定されていない場合は上記の0 + 1として示されます)。 3月の最終(5)日曜日(0)(3)1:00:00 UTC、10月の最終日曜日の2:00に戻ります。
繰り返しますが、そのTZは1996年から現在まで機能しますが、それ以外の場合は必ずしも機能しません。たとえば、1970-01-01 00:00:00 UTC(現地時間がロンドンの1:00:00 BST(英国標準時)だった場合、0 Unixエポック時間)の場合:
_$ TZ=:Europe/London date -d @0
Thu 1 Jan 01:00:00 BST 1970
$ TZ=GMT0BST,M3.5.0/1:00:00,M10.5.0/2:00:00 date -d @0
Thu 1 Jan 00:00:00 GMT 1970
_
POSIXごと 、の動作
TZ=BST-1
_は明確に定義されています(上記のとおり)TZ=BST
_(または_TZ=GMT
_/_TZ=UTC
_/_TZ=Europe/London
_)は指定されていません。TZ=:BST
_/_TZ=:Europe/London
_は実装定義です。これは、システムがそれをサポートし、それが何をするかを文書化することを目的としています。上記の3番目のケースでは、GNUシステム(および他のほとんどのUnixライクなシステム)で、TZ
が_:
_で始まる場合、その後のパスがタイムゾーン定義ファイル。GNUシステムの場合、_:
_が省略されている場合も同様です(値が_UTC0
_のような有効なタイムゾーン指定を形成している場合でも)しかし、通常、そのようなファイルは存在すべきではありませんが、システム上でPOSIX以外のシステムになるいくつかの例外が発生する可能性があります(たとえば、_TZ=CST6CDT date -d 1943-01-01 +%Z
_ファイルがあるため、_/usr/share/zoneinfo/CST6CDT
_はCWT
ではなくCST
を出力します1その時間の戦争時間を定義します))。
そのパスは通常、相対パスです。この場合、_$TZDIR
_(または、_/usr/share/zoneinfo
_が設定されていない場合の_$TZDIR
_のようなデフォルトが一般的です)に相対的です。セキュリティ上の理由から、_$TZDIR
_、絶対パス、または_..
_コンポーネントを使用した相対パスは、特権エスカレーションコンテキスト(setuidコンテキストなど)では無視されます。
したがって、通常、GNU=システムでは、_TZ=:BST
_と同じ_TZ=BST
_は、通常_/usr/share/zoneinfo/BST
_ファイルを探します。見つからない場合(その場合、BST
はタイムゾーン定義を識別できない可能性があるため、通常、BST
のUTC時間とタイムゾーン名(_date +%Z
_出力など)を想定します。
1WET
、CET
、MET
...のような_CST6CDT
_は、別の時代の名残です。 1993年後半に、TZデータベース(現在の IANAによって維持 ) 変更 は、アドホック(およびほとんどの場合はあいまいな)名(MET
、_GB-Eire
_、WET
など)の使用から)を_Area/City
_に変更します。この都市は、ゾーンが適用される(リリース時の)最も人口の多い都市です(領域は大陸/海などの大きな領域です)。かつて_GB-Eire
_(WETではない)を使用していたイギリス本土では、現在(1993年以降)_Europe/London
_を使用しています。 _GB-Eire
_(WET
など)は下位互換性のために引き続き利用できます(_GB-Eire
_は_Europe/London
_にリンクするようになりましたが、WET
は冬のUTCを使用するゾーンとして定義され、DSTのEU規則(英国では1996年以来EUの規則に従っているだけであり、英国がEUを去った今、誰も未来がどうなるかを言うことはできませんが))新しい展開では現在使用すべきではありません。