Time Zone, Leap Year, Date Format, Epoch Time 时区, 闰年, 日期格式
前言
以前有写过一篇了, 但很乱, 这篇就作为它的整理版吧.
Leap Year 闰年
闰年是指那些有 366 天, 二月份有 29号 的年份. 比如 2020年 有 2月29日, 所以 2020 就是闰年.
why leap year?
地球自转一圈是一天, 地球绕太阳转一圈是一年. 地球绕太阳转一圈的同时, 地球一共自转了 365 圈, 所以就是 365 天.
这个计算并不精准, 因为地球并不是刚刚好转 365 圈的, 其实是超过的. 正确的天数是 365天5小时48分46秒
于是, 如果按 365 天计, 每一年就少了 5 小时多. 每四年就少了一天. 久了就越差越远了.
所以必须弥补回来, 最简单的方式是, 每四年补回一天. 这样就准了
四年一闰, 百年不闰, 四百年再闰
但仔细计算会发现, 每四年加一天是有多的. 久而久之也会不精准, 于是最终就变成了大家熟悉的四年一闰, 百年不闰, 四百年再闰.
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 有, 因为四百年再润
每四年调一次, 100 年又调一次, 400 年又调一次. 所以时间一直都是有微差的 (但很小很小), 直到 400 年才对准.
Time Zone 时区
世界各地的时间很奇妙, 比如跨年都是在 12月31号 晚上 11:59分 放烟花庆祝. 但是美国的晚上是马来西亚的白天 (因为彼此在地球的另一端, 一个面向太阳, 另一个就是夜晚)
如果用统一时间的话, 会有两个后果, 第一, 马来西亚人只能在白天放烟花庆祝新年, 第二, 马来西亚人必须在 12月31号 下午 3:59分 倒数跨年. 显然这两个都不可能被接受. 所以不同的地区必须要有不同的时间 (时区).
但统一时间任然是有必要的, 不然跨国沟通也会有问题, 所以除了时区, 我们也有统一的时间 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 哦.
时区小知识:
整个地球分为 24 个时区, 从 -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 夏令时) 夏令时是一个机制, 为了节约能源, 它的做法是在夏季左右把时间调后一小时, 然后又在夏季结束后调前一小时, 这个规则也是通过时区管理的.
例子: "Sun Mar 09 2014 01:59:00 GMT-0500 (EST)" -> "Sun Mar 09 2014 03:00:00 GMT-0400 (EDT)". 两点钟消失了, 因为时间被调后了一小时, offset 从 -0500 变成了 -0400.
日期格式
不同国家除了时区不一样, 日期的格式也有很多区别.
new Date().toLocaleString('en-US'); // 1/15/2023, 2:13:33 PM
new Date().toLocaleString('zh-TW'); // 2023/1/15 下午2:13:33
new Date().toLocaleString('ms-MY'); // 15/1/2023, 2:13:33 PTG
美国的格式是 1/15/2023 月/日/年, pm 代表晚上
台湾是 2023/1/15 年/月/日
马来西亚是 15/1/2023 日/月/年 PTG 是 petang 马来语, 下午的意思
这些格式最烦人的就是日和月经常会分不清.
程序员比较喜欢和常看见的格式是
new Date().toISOString(); // 2023-01-15T06:19:08.034Z
new Date().toUTCString(); // Sun, 15 Jan 2023 06:19:08 GMT
ISO : 年-月-日 z 表示时区是 UTC
UTC/GMT 用了 Jan 来表示月份, 这样就不容易和日搞混了.
注:语言和格式 (排位顺序),都会收地域的影响。
字符
日期格式可以用一些字符来表达 (不同语言可能有微差, 但基本规则是一致的)
比如 C# 的 yyyy-MMM-dd hh:mm:ss tt 表示 年-月-日 时:分:秒: am/pm
规则有三个特点
1. 缩写, y 是 year 的缩写, s 是 second 的缩写
2. 大小写, month 和 minutes 的缩写都是 m, 所以需要靠大小写来区分, M 代表 month, m 代表 minute.
3. 数量 d 表示最少显示一位数, dd 表示最少两位数. 比如一号, d=1, dd=01, 11号则是一样的 d=11, dd=11
常用:
yy = 23
yyyy = 2023
M = 1, 11
MM = 01, 11
MMM = Jan, Nov (文字)
MMMM = January, November
d = 1, 11
dd = 01, 11
ddd = Mon (星期几)
dddd = Monday
H = 1, 13 (24小时制)
HH = 01, 13
h = 1, 1
hh = 01, 01
m = 1
mm = 01
s = 1
ss = 01
tt = AM/PM (其它语言可能不一样)
K = +08:00 (其它语言可能不一样)
Epoch Time
0001 年是耶稣诞生的年份, 1970 年是 Unix 诞生的年份.
Epoch Time 指的就是 1970年1月1 号. JavaScript Date.getTime 返回的就是 1970年1月1号到指定 datetime 的毫秒数.
Time Zone, Leap Year, Date Format, Epoch Time 时区, 闰年, 日期格式的更多相关文章
- 【Linux】date命令用法详解(日期格式)
inux下date命令用法 date [OPTION]… [+FORMAT] date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] date命令参数 ...
- Json序列化日期/Date(xxxx)/ JS转化为常用日期格式
记录开发过程中的代码片段,方便日后归纳.总结,效果如图所示: 转换前: 转换后: 代码如下,需要的朋友们自取: //JS转化为json常用日期格式 function FormatToDate(v ...
- js扩展Date对象的方法,格式化日期格式(prototype)
扩展:Date.prototype.format = function(format){ var o = { "M+" : this.getMonth()+1, ...
- sqlserver date与datetime区别及sqlserver日期格式转换
date是SQL Server 2008新引进的数据类型.它表示一个日子,不包含时间部分,可以表示的日期范围从公元元年1月1日到9999年12月31日.只需要3个字节的存储空间.DateTime 日期 ...
- 常用类--Date日期类,SimpleDateFormat日期格式类,Calendar日历类,Math数学工具类,Random随机数类
Date日期类 Date表示特定的时间,精确到毫秒; 构造方法: public Data() public Date(long date) 常用方法: public long getTime() pu ...
- 利用Format函数格式化时间和日期
在做机房收费系统的时候,因为需要使用到日期进行查询,所以在数据表中没有使用自动添加日期的功能,而是采用了自定义的格式插入.但由于事先没有对时间转换的格式进行统一,导致后面查询时出现的问题不断. 插入时 ...
- bash date format
Bash Date To format Bash Date to a required one, bash shell provides date command along with many fo ...
- Calendar to julian date format
1.JULIAN DATE 定义 2.示例: 定义枚举: public enum JulianDateType { /// <summary> /// J ...
- javascript Date format(js日期格式化) (转)
方法一:这个很不错,好像是 csdn 的 Meizz 写的: // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) ...
- [转]javascript Date format(js日期格式化)
方法一:这个很不错,好像是 csdn 的 Meizz 写的: // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) ...
随机推荐
- Elasticsearch tp5使用
下载elassticsearch和kibana的网址:https://www.elastic.co/cn/downloads/?elektra=home&store=hero 下载Elasti ...
- [oeasy]python0021_宝剑镶宝石_爱之石中剑_批量替换_特殊字符_特殊颜色
继续运行 回忆上次内容 上次 运行了 game.py 分析了 game.py 也大致读懂了 game.py 添加图片注释,不超过 140 字(可选) 这个 程序 可以进一步 进行修改吗 ...
- oeasy教您玩转vim - 17 - # 向上向下
向上向下 回忆上节课内容 和 f 相关的是跳到 向 前 跳到是 f 向 后 跳到是 F 和 t 相关的是贴靠 向 前 贴靠是 t 向 后 贴靠是 T 和 小写 相关的是 向前 向前 跳跃是 f 向前 ...
- SUM_ACM-Codeforces Round 941 (Div. 2)
A Card Exchange https://codeforces.com/contest/1966/problem/A 思路:找规律,如果b>a,输出a,如果a中有大于等于b个数,输出b-1 ...
- 题解:P9777 [HUSTFC 2023] Fujisaki 讨厌数学
令 \(f(n)=x^{n}+x^{-n}\). 可以发现 \(f(n)f(m)=x^{n-m}+x^{m-n}+x^{n+m}+x^{-n-m}=f(n-m)+f(m+n)\). 若 \(m=1\) ...
- 记一次seata启动错误日志ErrMsg:failed to req API:/nacos/v1/ns/instance after all servers....
错误日志如下: java.lang.RuntimeException: ErrCode:500, ErrMsg:failed to req API:/nacos/v1/ns/instance afte ...
- web3产品介绍:mask将Web3的隐私和优势引入像Facebook和Twitter这样的社交媒体平台
介绍: Mask Network是一个开源的浏览器扩展,将Web3的隐私和优势引入像Facebook和Twitter这样的社交媒体平台.它是一个功能强大的工具,允许用户在社交媒体上享受区块链的隐私保护 ...
- 【Docker】06 部署挂载本地目录的Nginx
1.拉取Nginx镜像: docker pull nginx:1.19 2.生成一个测试的Nginx容器: docker run --rm --name nginx-test -p 8080:80 - ...
- 《Python数据可视化之matplotlib实践》 源码 第二篇 精进 第六章
图 6.1 import matplotlib.pyplot as plt import numpy as np x=np.linspace(-2*np.pi, 2*np.pi, 200) y=np. ...
- Hessian Free Optimization——外国网友分享的“共轭梯度”的推导
外国网友分享的"共轭梯度"的推导: https://andrew.gibiansky.com/blog/machine-learning/hessian-free-optimiza ...