Time Zone, Leap Year, Date Format 時區, 閏年, 日期格式

前言

 以前就寫過一篇, 這篇是整理版 TimeZone 時區 (JS .NET JSON MYSQL) + work week 閏年

 

Leap Year 閏年

閏年是指那些有 366 天, 二月份有 29 號的年份. 比如 2020 年有 2 月 29 日, 所以 2020 就是閏年.

why leap year?

地球自轉一圈是一天, 地球繞太陽轉一圈是一年. 地球繞太陽轉一圈的同時, 地球一共自轉了 365 圈, 所以就是 365 天.

這個計算並不精準, 因爲它並不是剛剛好轉 365 圈的, 其實是超過的. 正確的天數是 365天5小時48分46秒

於是, 如果按 365 天計, 每一年就少了 5小時多. 每四年就少了一天. 久了就越差越遠了.

所以必須彌補回來, 最簡單的計算是, 每四年補回 1 天. 這樣就準了

四年一閏, 百年不閏, 四百年再閏

但仔細計算會發現, 4 年加 1 天是有多出的. 久而久之也會不精準, 於是最終就變成了大家熟悉的四年一閏, 百年不閏, 四百年再閏.

console.log(new Date('1900-02-29').toLocaleDateString('en-MY')); // 01/03/1900 沒有 因爲百年不閏
console.log(new Date('1904-02-29').toLocaleDateString('en-MY')); // 29/02/1904 有,  因爲四年一潤
console.log(new Date('1908-02-29').toLocaleDateString('en-MY')); // 29/02/1908 有,  因爲四年一潤
console.log(new Date('2000-02-29').toLocaleDateString('en-MY')); // 29/02/2000 有,  因爲四百年再潤

每四年調 1 次, 100 年又調一次, 400 年又調一次. 所以時間一直都是有微差的 (但很小很小), 直到 400 年纔對準.

 

 

Time Zone 時區

世界各地的時間很奇妙, 比如跨年都是在12月31號 晚上 11:59 分放煙花慶祝. 但是美國晚上的時候, 馬來西亞是白天丫 (因爲彼此在地球的另一端丫, 一個面向太陽, 另一個肯定就是夜晚了)

如果用統一時間的話, 有 2 個後果, 第一, 馬來西亞人只能在白天放煙花慶祝, 第二, 馬來西亞人在 12月31號 下午 3點59分倒數跨年. 顯然這 2 個都不可能被接受. 所以不同的地區必須要有不同的時間 (時區).

但統一時間任然是有必要的, 不然跨國溝通也是問題, 所以除了時區, 我們也有統一的時間 UTC/GMT (它以英國時區爲標準, 爲什麼是英國呢? 因爲這個標準是在大英帝國時代定下的)

例子:

馬來西亞的時區是 Malaysia Standard Time 它的 offset 是 +08.00 對應英國的 UTC +00:00 快了 8 小時. 也就是說馬來西亞活在未來 8 小時.

時區是國家規定的, 而且是可以改的...

馬來西亞的時區以前是 +07:30 後來換成了 +08:00. 這種修改很容易引起 Bug. 因爲我們普遍會認爲 offset = timezone.

但其實 timezone 指的是一個規則. 裏面可能包含了許多不同的 offset. 

const time1 = new Date(1981, 1, 1);
console.log(time1.toUTCString()); // Sat, 31 Jan 1981 16:30:00 GMT
console.log(time1.getTimezoneOffset()); // -450 
const time2 = new Date(1982, 1, 1);
console.log(time2.toUTCString()); // Sun, 31 Jan 1982 16:00:00 GMT
console.log(time2.getTimezoneOffset()); // -480 多了 30 minutes

JS 的 Date 包含了 timezone 裏所有不同年份的 offset.

時區小知識:

整個地球分爲二十四時區, 從 -12:00 到 +13:00

UTC (Universal Time Coordinated) 全球統一時間 +00:00, 也是英國倫敦的時間

GMT(Greenwich Mean Time) UTC 的前生, 現在都叫 UTC 了.

PST (Pacific Standard Time -08:00) 也是很常見的時區. 美國, 加拿大那一帶用的

DST ( Daylight Saving Time 夏令時)  夏令時是一個機制, 爲了節約能源, 它的做法是在夏季左右把時間調後 1 小時, 然後又在夏季結束後調前 1小時, 這個規則也是通過時區管理的.

例子: "Sun Mar 09 2014 01:59:00 GMT-0500 (EST)" -> "Sun Mar 09 2014 03:00:00 GMT-0400 (EDT)". 2點消失了,因爲時間被調後了 1小時, offset 從 -0500 變成了 -0400.

 

日期格式

 timezone 我們下面會特別講, 它概念比較多.

格式指的是如何呈現日期時間. 年份在前面還是日期在前面, 用 24 小時制還是 am/pm. 分割符號用 hypen(-) 還是 slash(/').

每個國家其實都不太一樣. 這裏列出一下經常看見的

ISO 8601: 2023-01-14T17:09:56.288Z 

這個是前端最常見到的格式. Date to JSON 後就是這個格式. z 表示它是 UTC/GMT

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章