JavaScript 中的内置对象是我们经常会用到的, 那么今天我们就来说说 Date 的四种构造方法吧
一, new Date()
这是我们最常使用也最熟悉不过的 Date 对象的构造方法了, 通过无参数的构造函数我们可以默认获取到一个代表实例化时的 Date 对象
- var now = new Date();
- console.log(now) //Thu Sep 19 2019 16:13:08 GMT+0800 (中国标准时间)
二, new Date(value)
这个构造方法的参数是一个 Number 型, 表示自 1970 年 1 月 1 日 00:00:00 UTC(the Unix epoch)以来的毫秒数, 忽略了闰秒. 这个方法中可以用整型, 也可以用浮点型, 不过浮点型后面的小数点后的尾数一般会被忽略就是了. 虽然在 node 环境 (v10.15.3) 下参数的确是从 00:00:00 时分开始计数, 但是, 通过实测发现在部分浏览器环境 (在 Edge,Chrome 下如此) 下参数是却从 08:00:00 开始计数, 如下代码所示:
- // 浏览器
- var time1 = new Date(1000);
- var time2 = new Date(2000.2);
- var time3 = new Date(2000.8);
- console.log(time1); //Thu Jan 01 1970 08:00:01 GMT+0800 (中国标准时间)
- console.log(time2); //Thu Jan 01 1970 08:00:02 GMT+0800 (中国标准时间)
- console.log(time3.getMilliseconds()); //0
- //node
- var time4 = new Date(1000);
- console.log(time4); //1970-01-01T00:00:00.001Z
原因分析: node 中是严格遵守 UTC 时间标准的, 所以是严格的 1970 年 1 月 1 日 00:00:00 UTC(the Unix epoch); 而在浏览器中一般是以本地时间为准, 例如: 在中国是以北京时间为基准的, 而北京在东八区, 所以会比标准的格林尼治时间要多 8 个小时, 将电脑时区设置成太平洋时区后测试
- // 改成太平洋时间后
- var time5 = new Date(1000);
- console.log(time5); //Wed Dec 31 1969 16:00:01 GMT-0800 (Pacific Standard Time)
看到太平洋时间发现时间被 "减了", 就会想到参数为负数的时候, 是不是也会从这个基准时间开始减, 如下:
- // 北京时间下
- var time6 = new Date(-1000);
- console.log(time6); //Thu Jan 01 1970 07:59:59 GMT+0800 (China Standard Time)
三, new Date(dateString)
这个构造函数应该是最有用和最会出现一些问题的了. 参数 dateString, 顾名思义, 是一个 String 型的格式化 date 字符串. 该字符串应该能被 Date.parse()方法正确识别, 即符合 IETF-compliant RFC 2822 timestamps 或 version of IOS8601. 那这个构造函数到底能解析哪些格式化字符串? 又不能解析哪些字符串呢?
注: 因为该构造函数在不同浏览器以及不同 node 版本之间有差异, 故不推荐大家使用, 同理也不推荐使用 Date.parse, 大家可以使用自己定义的工具函数把字符串转成 date 哦!
- var time1 = new Date('2019/9/9');
- var time2 = new Date('2019/09/09');
- var time3 = new Date('2019-9-9');
- var time4 = new Date('2019-09-09');
- var time5 = new Date('2019 9 9');
- var time6 = new Date('2019/9/9 12:20:05');
- var time7 = new Date('2019-9-9 12:70:100');
- var time8 = new Date('2019 9 9 14 0 1');
- var time9 = new Date('2019/09/09 -12:20:13');
- var time10 =new Date("February 3,2009 12:30:15");
- console.log(time1); //Mon Sep 09 2019 00:00:00 GMT+0800 (中国标准时间)
- console.log(time2); //Mon Sep 09 2019 00:00:00 GMT+0800 (中国标准时间)
- console.log(time3); //Mon Sep 09 2019 00:00:00 GMT+0800 (中国标准时间)
- console.log(time4); //Mon Sep 09 2019 08:00:00 GMT+0800 (中国标准时间)
- console.log(time5); //Mon Sep 09 2019 00:00:00 GMT+0800 (中国标准时间)
- console.log(time6); //Mon Sep 09 2019 12:20:05 GMT+0800 (中国标准时间)
- console.log(time7); //Invalid Date
- console.log(time8); //Invalid Date
- console.log(time9); //Invalid Date
- console.log(time10); Tue Feb 03 2009 12:30:15 GMT+0800 (中国标准时间)
一般情况下, 建议使用 yyyy/MM/dd hh:mm:ss 格式, 其他格式可能会出现意想不到的错误
四, new Date(year,monthIndex[,day[,hours[,minutes[,seconds[,milliseconds]]]]]
这个构造通过多个函数, 指定年月日时分秒来构造日期对象. 此方法参数至少为两个, 表示年月, 可选参数 5 个, 因为参数只有 1 个的话, 是 number 型会使用第二种构造方法, 是 string 型会使用第三种构造方法. 此方法的参数类型可以是整数, 浮点数 (浮点会被转化为整型), 或是字符串(字符串会被转化为 Number 型), 也可以是正数, 负数(但是, 注意不能超过日期所能表示的最大范围 -100,000,000 天至 100,000,000 天). 当参数只有 2 个的时候, 除了 day 默认为 1, 其余参数默认为 0(此时不受时区的影响). 另外, 参数 2 的月份需要加 1, 因为它对应的是 0-11(同 getMonth() 和 setMonth())
- var time1 = new Date(2019,2);
- var time2 = new Date(2019.3,'5');
- var time3 = new Date(2019,4,-3);
- var time4 = new Date(2019,5,10,13,70,100,50);
- console.log(time1); //Fri Mar 01 2019 00:00:00 GMT+0800 (中国标准时间)
- console.log(time2); //Sat Jun 01 2019 00:00:00 GMT+0800 (中国标准时间)
- console.log(time3); //Sat Apr 27 2019 00:00:00 GMT+0800 (中国标准时间)
- console.log(time4); //Mon Jun 10 2019 14:11:40 GMT+0800 (中国标准时间)
同之前的原因, 在 node 环境下, 时间会出现偏移, 在原有 "标准时间" 下要减去时区的时间差, 例如, 北京时间为东八区, 在浏览器中基本保持与传参一致, 但是在 node 环境下会 "减去" 这八小时的时间差, 相反, 西八区会加上这八小时的时间差.
最后, 再说一点, 就是 Date 对象作为参数构造 Date 在某些情况下也是可以的, 这个时候, 参数先被解析成字符串, 然后通过第二种构造方法执行
来源: http://www.bubuko.com/infodetail-3204564.html