Date相关
处理时间是常见的需求,总结下date类的相关知识
构建时间对象
date 对象基于1970年1月1日(世界标准时间)起的毫秒数。
构建对象实例有多种方式:
- 不传入参数,默认以系统当前时间返回一个时间对象.
new date();
new date(); // wed mar 13 2019 10:49:28 gmt+0800 (中国标准时间)
返回的是一个对象实例,控制台打印了时间字符串,是默认调用了tostring()
方法。
- 传入 自1970年1月1日00:00:00 (世界标准时间) 起经过的毫秒数.
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 无法转换成数字的参数
这种方式至少需要传入两个整数参数标志年、月,只传入一个参数会当做毫秒数进行构建;传入的参数会自动转换成数字,所以例子中传入数字字符串也是可以创建成功的。
如果把date()
直接当作函数调用,不过有没有传入参数,都会返回当前时间的时间字符串
date() // "wed mar 13 2019 20:22:42 gmt+0800 (中国标准时间)" date(2011,11) // "wed mar 13 2019 20:22:47 gmt+0800 (中国标准时间)"
自动折算
时间的参数都是有范围的:
- 年 使用四位数年份,比如2000。如果写成两位数或个位数,则加上1900,即10代表1910年。如果是负数,表示公元前
- 月份的范围是0~11 (0是一月份,11是12月份)
- 天数的范围是1~31
- 小时的范围是0~23
- 分钟的范围是0~59
- 秒数的范围是0~59
- 毫秒的范围是0~999
如果创建时间对象的时候,传入的参数超出了实际范围会怎样呢?
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
当传入的参数超出了实际范围,会自动折算成合理的范围 , 相邻的数值也会进行调整。
利用这个特性可以做很多的事情,比如,你想获取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对象提供了多种方法来获取/设置时间数据
- date对象提供了一系列get*方法,用来获取实例对象某个方面的值。
- gettime():返回实例距离1970年1月1日00:00:00的毫秒数,等同于valueof方法。
- getdate():返回实例对象对应每个月的几号(从1开始)。
- getday():返回星期几,星期日为0,星期一为1,以此类推。
- getfullyear():返回四位的年份。
- getmonth():返回月份(0表示1月,11表示12月)。
- gethours():返回小时(0-23)。
- getmilliseconds():返回毫秒(0-999)。
- getminutes():返回分钟(0-59)。
- getseconds():返回秒(0-59)。
- gettimezoneoffset():返回当前时间与 utc 的时区差异,以分钟表示,返回结果考虑到了夏令时因素。
还提供了这些方法对应的 utc 版本,用来返回 utc 时间。
- getutcdate()
- getutcfullyear()
- getutcmonth()
- getutcday()
- getutchours()
- getutcminutes()
- getutcseconds()
- getutcmilliseconds()
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
- date对象提供了一系列set*方法,用来设置实例对象的各个方面。
- setdate(date):设置实例对象对应的每个月的几号(1-31),返回改变后毫秒时间戳。
- setfullyear(year [, month, date]):设置四位年份。
- sethours(hour [, min, sec, ms]):设置小时(0-23)。
- setmilliseconds():设置毫秒(0-999)。
- setminutes(min [, sec, ms]):设置分钟(0-59)。
- setmonth(month [, date]):设置月份(0-11)。
- setseconds(sec [, ms]):设置秒(0-59)。
- settime(milliseconds):设置毫秒时间戳。
这些方法基本是跟get方法一一对应的,但是没有setday方法,因为星期几是计算出来的,而不是设置的。
set系列方法除了settime(),都有对应的 utc 版本,即设置 utc 时区的时间。
- setutcdate()
- setutcfullyear()
- setutchours()
- setutcmilliseconds()
- setutcminutes()
- setutcmonth()
- setutcseconds()
设置时间的方法,配合自动折算,可以很便捷的得到相对时间
let now = new date(); // 99天之后的时间 now.setdate(now.getdate() + 99) // 10小时之前 now.sethours(now.gethours() - 10)
- date对象提供一系列to* ,用来将时间对象转换为字符串
- tostring() 返回一个完整的日期字符串。
- todatestring() 返回年月日的字符串
- totimestring() 返回时间字符串,不包含年月日
也有对应的 utc 版本 和 local版本
- toutcstring() 返回对应的 utc 时间,也就是比北京时间晚8个小时。
- tolocalestring() 返回完整的本地时间。
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"
下一篇: JavaScript面向对象--封装