前言

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

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. Python 潮流周刊#60:Python 的包管理工具真是多啊(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  2. Django DRF @action 装饰器

    @action 装饰器在Django REST Framework (DRF) 中非常有用,它可以帮助你在ViewSet中创建自定义的动作,而不仅仅是依赖标准的CRUD操作(Create, Read, ...

  3. [oeasy]python0132_变量含义_meaning_声明_declaration_赋值_assignment

    变量定义 回忆上次内容 上次回顾了一下历史 python 是如何从无到有的 看到 Guido 长期的坚持和努力   编程语言的基础都是变量声明 python是如何声明变量的呢?   变量 想要定义变量 ...

  4. 强烈推荐:18.3k star,推荐一款简单易用的HTTP请求流量录制回放工具:Goreplay

    在软件开发和测试过程中,我们经常需要对应用程序的网络请求进行录制和回放,以便进行性能分析.压力测试或者模拟复杂的网络环境.今天,我要向大家推荐一款简单易用的 HTTP 请求流量录制回放工具:Gorep ...

  5. Visual Studio 必备插件集合:AI 助力开发

     一.前言 2024年AI浪潮席卷全球,编程界迎来全新的挑战与机遇.智能编程.自动化测试.代码审查,这一切都得益于AI技术的迅猛发展,它正在重塑开发者的日常,让编写代码变得更加高效.智能. 精选出最受 ...

  6. C# 泛型单例工厂

    核心代码,线程安全 class SingletonFactory<T> where T : new() { private static T uniqueInstance; private ...

  7. Docker 使用Docker创建MySQL容器

    使用Docker创建MySQL容器 实践环境 Docker version 20.10.5 MySQL5.7 Centos 7.8 创建步骤 1.拉取MySQL镜像 docker pull mysql ...

  8. 【Linux】11 RPM & YUM 管理工具 介绍

    rpm包的管理 介绍: 一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中. 它生成具有.RPM扩展名的文件.RPM是RedHat Package Manager(RedHat软件包 ...

  9. 使用 addRouteMiddleware 动态添加中间

    title: 使用 addRouteMiddleware 动态添加中间 date: 2024/8/4 updated: 2024/8/4 author: cmdragon excerpt: 摘要:文章 ...

  10. ubuntu18.04 源码方式安装wine , 警告,libxrender 64-bit development files not found, XRender won't be supported.

    警告信息: configure: WARNING: libxrender 64-bit development files not found, XRender won't be supported. ...