JS 中 new Date()的踩坑记录

1. IOS不兼容YYYY-MM-DD这样的格式

new Date('2023-1-1'); // Invalid Date

IOS目前还理解不了YYYY-MM-DD这样的格式,只支持YYYY/MM/DD。

2. 月份的索引是以0为起点的,而年份、日期却不是

new Date(2023,5,29); // Thu Jun 29 2023 00:00:00 GMT+0800 (中国标准时间)

得到的是一个反直觉的结果:2023年6月29日!!!

导致setMonth()方法也是从0开始设置的。

new Date("2023/05/29"); // Mon May 29 2023 00:00:00 GMT+0800 (中国标准时间)

注意这种写法,月份是正常理解下的。

3. 年份小于100,默认以19xx或20xx开头

当你需要格式化公元元年-公元100年之间的时间时

new Date(50,2,1); // Wed Mar 01 1950 00:00:00 GMT+0800 (中国标准时间)

如果你需要获得公元50年2月1日,必须这么写

new Date('0050-02-01'); // Tue Feb 01 0050 08:05:43 GMT+0805 (中国标准时间)

而且不能轻易添加时间

new Date('0050-02-01 00:00:00'); // Wed Feb 01 1950 00:00:00 GMT+0800 (中国标准时间)

还有一种情况

new Date('10-11-12') // Thu Oct 11 2012 00:00:00 GMT+0800 (中国标准时间)

这种情况下就不是1910年,也不是公元10年,而变成了2012年,这时候的排列就变成了月-日-年,而且还增加了2000年。
所以当年份为二位数的时候,构造函数把最后面那个当作年份,而且默认它为20xx年。

4. ‘-’和‘/’存在时区差异

new Date('2023-04-29'); // Sat Apr 29 2023 08:00:00 GMT+0800 (中国标准时间)
new Date('2023/04/29'); // Sat Apr 29 2023 00:00:00 GMT+0800 (中国标准时间)

两种格式返回的时间是不同的,相差了8个小时。

所以建议最好是加上小时和分钟

new Date('2023-04-29 00:00:00'); // Sat Apr 29 2023 00:00:00 GMT+0800 (中国标准时间)
new Date('2023/04/29 00:00:00'); // Sat Apr 29 2023 00:00:00 GMT+0800 (中国标准时间)

5. 一位数的问题

这种只针对‘-’格式的问题

new Date("2022-06-01"); // Wed Jun 01 2022 08:00:00 GMT+0800 (中国标准时间)
new Date("2022-6-01"); // Wed Jun 01 2022 00:00:00 GMT+0800 (中国标准时间)
new Date("2022-6-1"); // Wed Jun 01 2022 00:00:00 GMT+0800 (中国标准时间)

一位数和二位数的差异,相差了8个小时。

6. 建议

如果是年份小于100,写法如下:

new Date('0050-02-01'); // Tue Feb 01 0050 08:05:43 GMT+0805 (中国标准时间)

如果年份大于100,写法如下:

new Date('150/02/01'); // Sun Feb 01 0150 00:00:00 GMT+0805 (中国标准时间)
new Date(150,02,01); // Sun Feb 01 0150 00:00:00 GMT+0805 (中国标准时间)
new Date("2022/6/1"); // Wed Jun 01 2022 00:00:00 GMT+0800 (中国标准时间)
new Date("2022/6/1 00:00:00"); // Wed Jun 01 2022 00:00:00 GMT+0800 (中国标准时间)

你可能感兴趣的:(JavaScript,javascript,开发语言,前端)