处理时间是常见的需求,总结下Date类的相关知识函数
Date 对象基于1970年1月1日(世界标准时间)起的毫秒数。code
构建对象实例有多种方式:对象
new Date();
new Date(); // Wed Mar 13 2019 10:49:28 GMT+0800 (中国标准时间)
返回的是一个对象实例,控制台打印了时间字符串,是默认调用了toString()
方法。ip
new Date(value);
new Date(1323532800000); // Sun Dec 11 2011 00:00:00 GMT+0800 (中国标准时间) // 能够传入负数,表明1970年1月1日00:00:00以前的时间 new Date(-10000); // Thu Jan 01 1970 07:59:50 GMT+0800 (中国标准时间)
new Date(dateString);
new Date('2011-11-11') new Date('2011/11/11') new Date('11/11/2011') // Fri Nov 11 2011 00:00:00 GMT+0800 (中国标准时间) new Date('Sun Dec 11 2011 00:00:00') // Sun Dec 11 2011 00:00:00 GMT+0800 (中国标准时间) 注意这里是12月份了,11表明的12月 new Date('2011-11-11 11:11:11') new Date('2011-11-11T11:11:11') // Fri Nov 11 2011 11:11:11 GMT+0800 (中国标准时间) new Date('aa') // Invalid Date
只要能被[Date.parse()](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date/parse)
解析的字符串,均可以做为参数传入。字符串
new Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]]);
new Date(2011,11,11,11,11,11,111) // Sun Dec 11 2011 11:11:11 GMT+0800 (中国标准时间) new Date(2011,11) // Thu Dec 01 2011 00:00:00 GMT+0800 (中国标准时间) new Date(2011) // Thu Jan 01 1970 08:00:02 GMT+0800 (中国标准时间) 只传入一个整数参数,会被当作毫秒数解析 new Date('2011',11,11) //Sun Dec 11 2011 00:00:00 GMT+0800 (中国标准时间) 传入的参数会进行转换 new Date('2011.11',11,11) //Sun Dec 11 2011 00:00:00 GMT+0800 (中国标准时间) new Date('a',11,11) // Invalid Date 没法转换成数字的参数
这种方式至少须要传入两个整数参数标志年、月,只传入一个参数会当作毫秒数进行构建;传入的参数会自动转换成数字,因此例子中传入数字字符串也是能够建立成功的。get
若是把Date()
直接看成函数调用,不过有没有传入参数,都会返回当前时间的时间字符串class
Date() // "Wed Mar 13 2019 20:22:42 GMT+0800 (中国标准时间)" Date(2011,11) // "Wed Mar 13 2019 20:22:47 GMT+0800 (中国标准时间)"
时间的参数都是有范围的:date
若是建立时间对象的时候,传入的参数超出了实际范围会怎样呢?方法
new Date(2010,12,11) // Tue Jan 11 2011 00:00:00 GMT+0800 (中国标准时间) 月的参数12超出了范围,年份多了一年,而后月份变成了1月份(对应参数0) new Date(2010,11,0) // Tue Nov 30 2010 00:00:00 GMT+0800 (中国标准时间) 天的参数0不在范围内,因此月份变成了11(对应参数10),而后天变成了30 new Date(2010,11,11,25) // Sun Dec 12 2010 01:00:00 GMT+0800 (中国标准时间) 小时的参数25超出了范围,天数变成了12,而后小时变成了1
当传入的参数超出了实际范围,会自动折算成合理的范围 , 相邻的数值也会进行调整。im
利用这个特性能够作不少的事情,好比,你想获取2012年2月有共有多少天,能够这样处理。
new Date(2012,2,0).getDate() // 29 -- 三月(对应2)没有0天,因此折算到二月(对应1)的最后一天,这时取得getDate()便是该月的天数
若是+
或者 ==
运算符其中一个操做数是对象时,须要先把对象转化成原始值。其余的对象都会先调用valueOf()
方法,而时间对象类型会先调用toString()
1 + new Date() // "1Thu Mar 14 2019 13:51:46 GMT+0800 (中国标准时间)" new Date(2011,11,11).getTime() == new Date(2011,11,11) // false 后面的Date对象,调用了toString() new Date(2011,11,11).getTime() == +new Date(2011,11,11) // true 此时隐式转换期待转换为数字,调用了valueOf()
其余期待转换为数字的场景,也是正常先调用valueOf()
的
时间对象在传递过程当中,通常会转换为时间戳,有多种实现方式
new Date(2011,11,11).valueOf() // 1323532800000 new Date(2011,11,11).getTime() // 1323532800000 +new Date(2011,11,11) // 1323532800000 Date.now() // 1552543813256 当前时间距离时间零点(1970年1月1日 00:00:00 UTC)的毫秒数
注意以上都是毫秒,若是要转成UNIX时间戳(从1970年1月1日(UTC/GMT的午夜)开始所通过的秒数),能够用如下方法
Math.round(ms/1000)
Date对象提供了多种方法来获取/设置时间数据
还提供了这些方法对应的 UTC 版本,用来返回 UTC 时间。
new Date(2011,11,11,11,11,11,111).getHours() // 11 new Date(2011,11,11,11,11,11,111).getUTCHours() // 3 可见UTC时间比北京时间晚8个小时,也就是下面的时区差别 -480分钟 new Date(2011,11,11,11,11,11,111).getTimezoneOffset() // -480
这些方法基本是跟get方法一一对应的,可是没有setDay方法,由于星期几是计算出来的,而不是设置的。
set系列方法除了setTime(),都有对应的 UTC 版本,即设置 UTC 时区的时间。
设置时间的方法,配合自动折算,能够很便捷的获得相对时间
let now = new Date(); // 99天以后的时间 now.setDate(now.getDate() + 99) // 10小时以前 now.setHours(now.getHours() - 10)
也有对应的 UTC 版本 和 local版本
let now = new Date() undefined now.toString() // "Thu Mar 14 2019 14:32:18 GMT+0800 (中国标准时间)" now.toUTCString() // "Thu, 14 Mar 2019 06:32:18 GMT" UTC时间比北京时间晚8个小时 now.toLocaleString() // "2019/3/14 下午2:32:18"