js中Date的构造函数解读
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在某些情况下也是可以的,这个时候,参数先被解析成字符串,然后通过第二种构造方法执行