
私のシステム (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 を使用しているにもかかわらず、BST タイム ゾーンが 1 時間遅れているように見える理由です。
以下も関連している可能性があります:
$ 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
答え1
BST
はタイムゾーン名として認識されません。出力では省略形として使用されますが、タイムゾーンを指定するために使用することはできません。ほとんどのプログラムはタイムゾーン名をチェックせず、タイムゾーン名が認識されない場合は、暗黙的に GMT をデフォルトとします。
BST、CET、EST などの略語は必ずしも明確に定義されているわけではなく、あいまいな場合もあります (北米標準時なのか、オーストラリア東部標準時なのか)。これらは特定の地域でのみ意味を持ちますが、タイムゾーン設定は通常、世界中での使用を意図しています。さらに、BST などの略語は実際にはタイムゾーンを指定しているわけではなく、1 年のうちの一部 (夏時間が実施されているイギリス) の特定のタイムゾーンの時間のみを指定しています。したがって、明確な指定を使用する必要があります。そのほとんどは大陸/都市のパターンに従います。一般的な Linux システムでは、また他の多くの Unix バリアントでも、ディレクトリ を調べることで、どの略語が使用可能かを確認できます/usr/share/zoneinfo
。
GMT
したがって、冬には を使用し、BST
夏には を使用する代わりに、 を使用してくださいEurope/London
。
答え2
@Gilles が言ったように、 BST はdate
/に出力されるものdate +%Z
で、ユーザーに英国夏時間の日付 (つまり GMT+1) であることを伝えるものであり、タイムゾーンを定義するものではなく、 に使用できるものでもありません$TZ
。
BST はイギリスのユーザーにとって重要です。イギリスのユーザーが を見ると14:00 BST
、タイムスタンプがイギリス本土の夏時間の 14:00 (つまり UTC の 13:00) を指していることがわかります。これらの 3 文字または 4 文字のコードはイギリス、アメリカ、その他の英語圏の国で広く使用されているため、デフォルトの出力に表示されていますdate
(en_GB.UTF-8
ロケールなど)。一方、ほとんどのフランス人ユーザーは が何を意味するのかわかりません(が を指しているに14:00 CEST
もかかわらず)。CEST
中央ヨーロッパ夏時間、つまりフランスの夏に適用される GMT+2 なので、日付でタイムゾーンを指定する場合、CET
/ではなく UTC オフセットが含まれることに気付くでしょうCEST
( のようにmardi 2 mai 2017, 13:34:09 (UTC+0200)
)。
この$TZ
変数には3~4文字のコードを格納するためのものではありません。定義する/指定するタイムゾーン、つまり現在いる地域。アプリケーションはこれを使用して、任意の時点での UTC とのオフセット、冬時間と夏時間を切り替えるタイミング、冬時間と夏時間のコード (存在する場合) がユーザー (それが重要なユーザー) に表示されるかどうかを把握します。
そのためには、TZ
システム定義のタイムゾーン仕様を設定することができます。 のようにTZ=:Europe/London
(多くのシステムでも受け入れますがTZ=Europe/London
)、またはTZ
完全なルールを含めるようにします (ただし、これらのルールは制限されています)。
たとえば、TZ=:Europe/London
システムで を使用すると、ルールは から読み取られます/usr/share/zoneinfo/Europe/London
。
このファイルでは、例えば、1996年以降、UTCからのオフセットは、10月の最終日曜日の午前2時から3月の最終日曜日まで0(「グリニッジ標準時」のGMTという名前)、それ以外の場合は1(「英国夏時間」のBSTという名前)と指定されますが、1970年(Unix時間で0)から1972年までは、年間を通じて1(「英国夏時間」のBSTという名前)でした。標準時間"。
すでにお分かりのように、BST をタイムゾーン指定として使用するのは意味がありません。まず、BST は時点によって意味が異なり、現在のエポックだけを考慮した場合でも、サマータイムのコードに過ぎないため、年間全体のタイムゾーン指定として使用することはできません。
今では、完全なルールを含めることもできますTZ
。たとえば、70 年代初期の「英国標準時間 (夏時間ではない)」の場合、最も単純な形式の指定を使用できます。
TZ=BST-1
これは、常に UTC より 1 時間東のタイムゾーンを指定し、常に をdate +%Z
返しますBST
。このタイムゾーンは、1970 年代初期のイギリス本土と 1972 年以降の夏時間には適していますが、1972 年以降の冬時間には適していません (将来についてもわかりません)。
または、現在のルールの完全な仕様を使用することもできます。
TZ=GMT0BST,M3.5.0/1:00:00,M10.5.0/2:00:00
これは、1 年に 2 つの期間があり、1 つはオフセット 0 の GMT と呼ばれ、もう 1 つはオフセット 1 (指定されていない場合は上記で 0+1 として暗示される) の BST と呼ばれ、一方から他方への切り替えは 3 月 (3) の最後の (5) 日曜日 (0) の 1:00:00 UTC に行われ、10 月の最後の日曜日 (2) に戻ります。
繰り返しますが、TZ は 1996 年から現在まで有効ですが、それ以外の場合は必ずしも有効ではありません。たとえば、1970-01-01 00:00:00 UTC (0 Unix エポック時間、ロンドンの現地時間は 1:00:00 BST (英国標準時) でした) の場合:
$ 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
は実装定義つまり、POSIX ではそれが何を行うのかは説明されていませんが、システムはそれをサポートし、それが何を行うかを文書化することになっています。
上記の 3 番目のケースでは、GNU システム (および他のほとんどの Unix 系システム) では、TZ
が で始まる場合:
、その後に続くものはタイムゾーン定義ファイルへのパスとして扱われます。GNU システムの場合、 が省略されている場合も同様です:
(値が のような有効なタイムゾーン指定を形成する場合でも)。ただしUTC0
、一般的にはそのようなファイルは存在しないはずです。ただし、私のシステムでは例外がいくつかあり、非 POSIX システムになります (たとえば、を定義するファイル1があるため、 ではなくTZ=CST6CDT date -d 1943-01-01 +%Z
が出力されます)。CWT
CST
/usr/share/zoneinfo/CST6CDT
戦時中(その期間))。
そのパスは通常は相対パスであり、その場合は(または が設定されていない場合は一般的な$TZDIR
デフォルト) に相対的になります。セキュリティ上の理由から、 、絶対パス、またはコンポーネントを含む相対パスは、権限昇格コンテキスト(setuid コンテキストなど)では無視されます。/usr/share/zoneinfo
$TZDIR
$TZDIR
..
したがって、通常、GNU システムでは、TZ=:BST
、と同じ は、TZ=BST
通常、ファイルを検索します/usr/share/zoneinfo/BST
。見つからない場合 ( ではタイムゾーン定義を識別できないため、このような状況になることがあります)、通常は UTC 時間と、(出力にあるように) のBST
タイムゾーン名が想定されます。date +%Z
BST
1、、…などはCST6CDT
別の時代の名残である。1993年後半、TZデータベース(現在WET
CET
MET
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 を離脱しているため、将来どうなるかは誰にもわかりません))、新しい展開では現在使用しないでください。
答え3
Gilles の回答を補足します。私は OP と同じタイム ゾーンにいます。西ヨーロッパ時間、つまりWET
これが公式の名称です。記憶が確かなら、1996 年頃にポルトガルの Unix タイム ゾーンに含まれていました。
https://en.wikipedia.org/wiki/西ヨーロッパ時間
ヨーロッパ時間 (WET、UTC±00:00) は、西ヨーロッパと北西ヨーロッパの一部をカバーするタイムゾーンです。
以下の国と地域では、冬季に WET を使用しています。
- カナリア諸島、1946 年以降(スペインの残りの地域は CET、UTC+1) - フェロー諸島、1908 年以降
- 北東グリーンランド(ダンマルクハウンとその周辺地域)
- アイスランド、1968 年以降
- ポルトガル、1912 年以降(一時停止あり、アゾレス諸島を除く、UTC−1)[1]
- マデイラ諸島、1912 年以降(一時停止あり[2]
- アイルランド、1916 年以降(法的にはグリニッジ標準時として知られている)、1968 年から 1971 年を除く
- 英国および王室属領、イングランド、スコットランド、ウェールズ、チャンネル諸島、マン島では 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