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

 

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