我的 BST 時區晚一小時嗎?

我的 BST 時區晚一小時嗎?

我的系統(Debian 測試中的 Gnome 3)對當前時間感到困惑。當我運行時,date時間顯示正確,但某些應用程式比時間晚一個小時。例如,當我將事件新增至 Gnome 日曆時,日曆約會中顯示的事件時間將是我輸入的時間減去一小時。

我已經找到問題所在,但我不知道如何解決:

$ 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

輸出的前兩行是正確的,第三行晚了一個小時。我不明白的是為什麼 BST 時區似乎晚了一個小時,而同時當前時間卻是正確的 - 並且使用 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

答案1

BST不被識別為時區名稱。它在輸出中用作縮寫,但不能使用它來指定時區。大多數程式不會檢查時區名稱,如果無法辨識時區名稱,則會預設預設為 GMT。

BST、CET、EST 等縮寫並不總是明確定義,有時甚至含糊不清(是北美標準時間還是澳洲東部標準時間?)。它們僅在給定區域中有意義,而時區配置通常適用於全球範圍內使用。此外,像 BST 這樣的縮寫實際上並未指定時區,而僅指定一年中某個時區的時間(英國,夏令時有效)。因此,您應該使用明確的名稱,其中大多數都遵循大陸/城市的模式。在典型的 Linux 系統上,我想在許多其他 Unix 變體上也是如此,您可以透過查看目錄來查看哪些縮寫可用/usr/share/zoneinfo

GMT因此,不要在冬天和BST夏天使用,而是使用Europe/London.

答案2

date正如 @Gilles 所說, BST 是在/上輸出的東西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),因此您會注意到,當日期指定時區時,它們寧願包含 UTC 偏移量,而不是CET/CEST那裡(如mardi 2 mai 2017, 13:34:09 (UTC+0200))。

$TZ變數並不意味著包含那些 3-4 個字母的代碼。它包含一些東西定義/指定時區,您所在的區域。那些對其來說很重要的用戶)。

為此,您可以設定TZ為某些系統定義的時區規格。就像TZ=:Europe/London(儘管許多系統也接受TZ=Europe/London),或包含TZ完整的規則(儘管這些規則是有限的)。

例如,如果我TZ=:Europe/London在我的系統上使用,規則將從 中讀取/usr/share/zoneinfo/Europe/London

例如,該文件將指定自1996 年以來,從10 月最後一個星期日凌晨2 點UTC 到3 月最後一個星期日(名稱為GMT 表示“格林威治標準時間”)與UTC 的偏移量為0,其他為1(名稱為BST)代表“英國夏令時間”),而從 1970 年(0 Unix 時間)到 1972 年,全年均為 1,名稱為 BST,代表“英國夏令時間”標準時間」。

您已經可以看到,使用 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

這表示一年中有兩個時間段,一個時間段的名稱為GMT,偏移量為0,另一個時間段的名稱為BST,偏移量為1(未指定時,隱含為上面的0 +1),其中從一個時間段到另一個時間段的切換處於開啟狀態UTC 時間3 月最後(5) 個週日(0) (0) 1:00:00 以及10 月最後一個週日2: 00 返回。

再次強調,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 沒有告訴我們它做了什麼。

在上面的第三種情況中,在 GNU 系統(我相信大多數其他類 Unix 系統)上,當TZ以 開頭時:,後面的內容將被視為時區定義檔案的路徑。在 GNU 系統的情況下,當 被省略時也是如此:(即使該值形成一個有效的時區規範,如UTC0,但通常不應該存在這樣的文件,儘管我可以在我的系統上看到一些例外,這使得它成為非 POSIX 系統(例如TZ=CST6CDT date -d 1943-01-01 +%Z輸出CWT而不是CST因為有一個/usr/share/zoneinfo/CST6CDT檔案1定義了戰時在那段時間))。

該路徑通常是相對路徑,在這種情況下它是相對的$TZDIR(或像通常情況下未設定/usr/share/zoneinfo時的某些預設值)。$TZDIR出於安全原因,在權限升級上下文中(例如在 setuid 上下文中),將忽略$TZDIR帶有元件的絕對路徑或相對路徑。..

因此,通常在 GNU 系統上, , 與通常查找文件TZ=:BST相同。如果沒有找到(就像這種情況,因為不可能識別時區定義),它通常會假定 UTC 時間和時區名稱(如輸出所示)。TZ=BST/usr/share/zoneinfo/BSTBSTdate +%ZBST


1CST6CDT諸如WETCET、 ...之類的MET都是另一個時代的殘餘。 1993年底,TZ資料庫(現在由 IANA 維護改變了從使用臨時(且通常是不明確的)名稱(如METGB-EireWET)到Area/City該城市是該區域適用的人口最多的城市(在發佈時)(區域是大陸/海洋等大面積區域)。對於英國大陸,您過去使用GB-Eire(不是 WET),現在(自 1993 年以來)使用Europe/London. GB-Eire(如WET)仍然可用於向後相容(GB-Eire現在連結到Europe/London,而WET被定義為在冬季使用 UTC 和歐盟 DST 規則的區域(英國自 1996 年以來才遵循歐盟規則,英國現在已離開歐盟,沒有人能說出未來會怎樣))但現在不應該在新部署中使用。

答案3

補充吉爾斯的答案;我和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]
- 愛爾蘭,自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 早一小時。 WEST 在英國被稱為英國夏令時間,在愛爾蘭被正式稱為愛爾蘭標準時間。

夏令時的官方名稱是 WEST(西歐夏令時間),WET用於TZ,並考慮夏令時/DST,提前一小時。

如今,「歐洲/倫敦」可能是更好的選擇,但了解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

相關內容