前言

以前有写过一篇了, 但很乱, 这篇就作为它的整理版吧.

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# DateTime Format

日期格式可以用一些字符来表达 (不同语言可能有微差, 但基本规则是一致的)

比如 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 时区, 闰年, 日期格式的更多相关文章

  1. 【Linux】date命令用法详解(日期格式)

    inux下date命令用法 date [OPTION]… [+FORMAT] date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] date命令参数 ...

  2. Json序列化日期/Date(xxxx)/ JS转化为常用日期格式

    记录开发过程中的代码片段,方便日后归纳.总结,效果如图所示: 转换前:    转换后: 代码如下,需要的朋友们自取: //JS转化为json常用日期格式 function FormatToDate(v ...

  3. js扩展Date对象的方法,格式化日期格式(prototype)

    扩展:Date.prototype.format = function(format){     var o =  {     "M+" : this.getMonth()+1, ...

  4. sqlserver date与datetime区别及sqlserver日期格式转换

    date是SQL Server 2008新引进的数据类型.它表示一个日子,不包含时间部分,可以表示的日期范围从公元元年1月1日到9999年12月31日.只需要3个字节的存储空间.DateTime 日期 ...

  5. 常用类--Date日期类,SimpleDateFormat日期格式类,Calendar日历类,Math数学工具类,Random随机数类

    Date日期类 Date表示特定的时间,精确到毫秒; 构造方法: public Data() public Date(long date) 常用方法: public long getTime() pu ...

  6. 利用Format函数格式化时间和日期

    在做机房收费系统的时候,因为需要使用到日期进行查询,所以在数据表中没有使用自动添加日期的功能,而是采用了自定义的格式插入.但由于事先没有对时间转换的格式进行统一,导致后面查询时出现的问题不断. 插入时 ...

  7. bash date format

    Bash Date To format Bash Date to a required one, bash shell provides date command along with many fo ...

  8. Calendar to julian date format

    1.JULIAN DATE 定义 2.示例: 定义枚举: public enum JulianDateType    {        /// <summary>        /// J ...

  9. javascript Date format(js日期格式化) (转)

    方法一:这个很不错,好像是 csdn 的 Meizz 写的: // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) ...

  10. [转]javascript Date format(js日期格式化)

    方法一:这个很不错,好像是 csdn 的 Meizz 写的: // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q)  ...

随机推荐

  1. oeasy教您玩转vim - 14 - # 行头行尾

    行头行尾 回忆上节课内容 我们这次了解了 大词 和 小词 小词 就是我们常规意义的词 被 =." 等标点分开的词 大词 里面包括了 =." 等标点 只能被空格.tab.换行分割 W ...

  2. EFCore DbFirst从数据库生成实体类

    1.点击"工具"->"NuGet包管理器"->"程序包管理器控制台" 分别安装以下几个包 Mysql 版本: Install-P ...

  3. 阶乘-n!_C语言实现

    n! // Code file created by C Code Develop #include "stdio.h" #include "stdlib.h" ...

  4. Kmesh v0.4发布!迈向大规模 Sidecarless 服务网格

    本文分享自华为云社区<Kmesh v0.4发布!迈向大规模 Sidecarless 服务网格>,作者: 云容器大未来. 近日 Kmesh 发布了 v0.4.0 版本,感谢社区的贡献者在两个 ...

  5. Jmeter函数助手39-isPropDefined

    isPropDefined函数用于判断属性是否存在. 变量的名称:填入属性名.如果属性名存在返回true,如果不存在返回false 1.jmeter的属性查看路径:测试计划右键"添加&quo ...

  6. ComfyUI插件:ComfyUI layer style 节点(二)

    前言: 学习ComfyUI是一场持久战,而ComfyUI layer style 是一组专为图片设计制作且集成了Photoshop功能的强大节点.该节点几乎将PhotoShop的全部功能迁移到Comf ...

  7. 【Python】Word文档操作

    依赖库下载: pip install python-docx -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install docx2pdf -i ...

  8. 【Java】MultiThread 多线程 Re02 线程通讯

    一.等待与唤醒 /** * 线程通讯问题 * Object wait, notify, notifyAll * Condition await signal signAll * CountDownLa ...

  9. 【Layui】09 动画 Anim

    文档地址: https://www.layui.com/demo/anim.html 8种动画 <fieldset class="layui-elem-field layui-fiel ...

  10. 数字人 —— 虚拟人 —— Inworld AI用生成式AI——生成式游戏NPC

    相关: https://www.ithome.com/0/756/603.htm https://baijiahao.baidu.com/s?id=1774732295233220838 https: ...