什麼是時區? 1884年在華盛頓召開的一次國際經度會議(又稱國際子午線會議)上,規定將全球劃分為24個時區(東、西各12個時區)。規定英國(格林尼治天文臺舊址)為中時區(零時區)、東1-12區,西1-12區。每個時區橫跨經度15度,時間正好是1小時。 時區的分類? 理論時區 上述時區定義其實是理論時 ...
什麼是時區?
1884年在華盛頓召開的一次國際經度會議(又稱國際子午線會議)上,規定將全球劃分為24個時區(東、西各12個時區)。規定英國(格林尼治天文臺舊址)為中時區(零時區)、東1-12區,西1-12區。每個時區橫跨經度15度,時間正好是1小時。
時區的分類?
理論時區
上述時區定義其實是理論時區
。理論時區的時間採用其中央經線(或標準經線)的地方時。比如東八區的經度範圍是112.5°E~127.5°E,中央經線為120°E。
所以每差一個時區,區時相差一個小時,相差多少個時區,就相差多少個小時。東邊的時區時間比西邊的時區時間早。
法定時區
複原遼闊的國家,橫跨多個時區,常常以國家內部行政分界線為時區界線。這就是實際時區
,即法定時區
。
比如中國的地理區劃,西至75°E,東至135°E,橫跨多個時區,然而實際上我們國家法定時區為東八區標準時。居住在我國西部,如新疆的同學應該深有感觸,北京時間早上六點時,當地時間可能還處於凌晨 3 點,天空一片漆黑。
而美國同樣橫跨多個時區,但是美國本土使用了西部時間(-8)、山地時間(-7)、中部時間(-6)、東部時間(-5),共四個時區(阿拉斯加和夏威夷群島分別是 -8 和 -10 )。所以簡單的說美國時區就是 -8 區,這是不正確的。
國際日期變更線
東 12 區和西 12 區的中央經線其實都是180°經線,為了避免同一個時區即存在新的一天,又存在舊的一天,人為規定 180° 以西至 0 點所在經線,為新的一天,以東為 舊 的一天。
但是太平洋上存在一些國家,行政區劃橫跨180°經線,為了方便管理,國際日期變更線其實不是一條直線。
前面提到,理論時區
只包括西 12 區~東 12 區 24 個時區。但是太平洋國家薩摩亞在2011年12月29日完結時把標準時間從國際日期變更線以東調整到國際日期變更線以西,即從時區 UTC-11 改為 UTC+13(夏時制由 UTC-10 改為UTC+14 )。因此,現行國際時區標準中,存在一個“東13區”。
常見的時間標準
一般說到時區,就會提到這幾個名詞,UTC
,GMT
,DST
,CST
,那這幾個名詞分別代表什麼含義呢?
GMT
GMT 即 Greenwich Mean Time, 代表格林威治標準時間。
前文提到,1884 年國際經度會議決定選擇格林威治的子午線,作為劃分地球東西兩半球的經度零度。而格林威治皇家天文臺早在十七世紀,就已經是海上霸主大英帝國的擴張而進行天體觀測。
對全球而言,這裡所設定的時間是世界時間參考點,全球都以格林威治的時間作為標準來設定時間。
常說的時間戳 — timestamp,就是指格林威治時間 1970年01月01日00時00分00秒
(北京時間1970年01月01日08時00分00秒)起至現在的總秒數。
UTC
UTC 即 Coordinated Universal Time ,代表世界協調時間或協調世界時。
UTC 是經過平均太陽時(以格林威治時間 GMT 為準)、地軸運動修正後的新時標以及以“秒”為單位的國際原子時所綜合精算而成的時間,計算過程相當嚴謹精密。協調世界時 是最接近 GMT 的幾個替代時間系統之一。
普遍認為,UTC 時間被認為能與 GMT 時間互換,但 GMT 時間已不再被科學界所確定。
一般來說,當我們提到 UTC 時間而不帶任何別的修飾時,常指 UTC 0點。
UTC 和 GMT 唯一的差別,UTC 有閏秒,GMT 沒有。
// UTC 格林威治時間 2023-01-29T09:08:18.927058Z
println(Instant.now())
// UTC 格林威治時間 2023-01-29T09:08:18.941339Z
println(Instant.now().atOffset(ZoneOffset.UTC))
// UTC 北京時間 2023-01-29T17:08:18.942359+08:00[Asia/Shanghai]
println(Instant.now().atZone(ZoneId.of("Asia/Shanghai")))
// UTC 北京時間 2023-01-29T17:08:18.979096
println(LocalDateTime.now())
DST
DST 即 Daylight Saving Time ,代表 日光節約時間 。這是一個完全由各國政府主導的行政行為,即與 GMT、UTC 這兩種基於地理的時間標準而言,DST 不是一種參考經線坐標的標準。
所謂日光節約時間,是指在夏天太陽升起的比較早時,將時鐘撥快一小時,以提早日光的使用,削減燈光照明和耗電開支。在英國則稱為夏令時間(Summer Time)。
全球仍有部分國家在實施夏令時。值得註意的是,我國在1986年至1991年期間也使用了夏令時,可以參考 百度百科-夏令時 中對中國政策部分的描述。
簡而言之,我們國家在上述時期的夏天, 列印出來的時區是 +9 區 。
// 北京標準時間 1985-07-01T00:00+08:00[Asia/Shanghai]
println(LocalDateTime.of(1985, 7, 1, 0, 0, 0).atZone(ZoneId.of("Asia/Shanghai")))
// 北京夏令時間 1986-07-01T00:00+09:00[Asia/Shanghai]
println(LocalDateTime.of(1986, 7, 1, 0, 0, 0).atZone(ZoneId.of("Asia/Shanghai")))
// 北京標準時間 1992-07-01T00:00+08:00[Asia/Shanghai]
println(LocalDateTime.of(1992, 7, 1, 0, 0, 0).atZone(ZoneId.of("Asia/Shanghai")))
各國標準
每個國家/地區使用的時區標準,都用不同的簡稱,可參考 moment.timezone.。java.time.ZoneId
維護了一份國際時區標準中的地區名稱:
public static final Map<String, String> SHORT_IDS = Map.ofEntries(
entry("ACT", "Australia/Darwin"),
entry("AET", "Australia/Sydney"),
entry("AGT", "America/Argentina/Buenos_Aires"),
entry("ART", "Africa/Cairo"),
entry("AST", "America/Anchorage"),
entry("BET", "America/Sao_Paulo"),
entry("BST", "Asia/Dhaka"),
entry("CAT", "Africa/Harare"),
entry("CNT", "America/St_Johns"),
entry("CST", "America/Chicago"),
entry("CTT", "Asia/Shanghai"),
entry("EAT", "Africa/Addis_Ababa"),
entry("ECT", "Europe/Paris"),
entry("IET", "America/Indiana/Indianapolis"),
entry("IST", "Asia/Kolkata"),
entry("JST", "Asia/Tokyo"),
entry("MIT", "Pacific/Apia"),
entry("NET", "Asia/Yerevan"),
entry("NST", "Pacific/Auckland"),
entry("PLT", "Asia/Karachi"),
entry("PNT", "America/Phoenix"),
entry("PRT", "America/Puerto_Rico"),
entry("PST", "America/Los_Angeles"),
entry("SST", "Pacific/Guadalcanal"),
entry("VST", "Asia/Ho_Chi_Minh"),
entry("EST", "-05:00"),
entry("MST", "-07:00"),
entry("HST", "-10:00")
);
參考資料: