JavaScript 时间处理
Date 对象是 JavaScript 原生的时间库。它以 1970-1-1 00:00:00 作为时间的零点,范围为零点前后各一亿天。
概念
- Unix 时间戳:一个整数值,表示自 1970 年 1 月 1 日 00:00:00 UTC(the Unix epoch)以来的毫秒数
- GMT:格林威治时间,规定太阳每天经过位于英国伦敦郊区的皇家格林威治天文台的时间为中午 12 点。格林威治时间是最初的世界标准时间。
- 本初子午线:为进行天文观测,规定将穿过英国伦敦格林威治天文台子午仪中心的一条经线零度参考线,及本初子午线。
- 世界标准时间(UTC):因为地区自转不均匀等问题,GMT 并不标准,UTC 更加准确,是现行的世界标准时间。
- 时区:从格林威治本初子午线起,经度每向东或者向西间隔 15°,就划分一个时区,在这个区域内,大家使用同样的标准时间,全球共分为 24 个标准时区,相邻时区的时间相差一个小时。
- 本地时间:我们所在(或者所使用)时区内的当地时间
创建时间对象
使用构造函数 new Date()创建,支持多种形式的参数,构建的时间对象为本地时间。
- 不传任何参数,则返回的当前时间
- UNIX 时间戳:距离零点的毫秒数,值为负整数时则表示公元前
- 字符串:可以被
Date.parse()解析的字符串都可以当做参数,注意:由于浏览器的差异,强烈不建议使用字符串创建 Date 对象,YYYY-MM-DD HH:mm:ss格式字符串不能被解析 new Date(year, month[, date[, hrs[, min[, sec[, ms]]]]])- 月份从 0 开始,0 代表 1 月
- 如果传入的值超过正常范围,会被自动折算
- 当值为负数时,表示扣去的时间
- 如果提供了至少两个参数,其余的参数均会默认设置为 1(如果没有指定 day 参数)或者 0(如果没有指定 day 以外的参数)。
例子: 传入值不在范围内自动折算
new Date(2017, 15)
// Sun Apr 01 2018 00:00:00 GMT+0800 (CST)
new Date(2018, 0, 0)
// Sun Dec 31 2017 00:00:00 GMT+0800 (CST)
new Date(2018, 0, -1)
// Sat Dec 30 2017 00:00:00 GMT+0800 (CST)
日期运算
- 减法: 日期对象自动转换为数值,等于当前毫秒数,返回值为两个时间相差的毫秒数
- 加法: 日志对象自动转换为字符串,转换时调用
toString()方法,最后值为两个时间字符串的拼接
静态方法
Date.now(): 返回当前时间距离零点时间的毫秒数Date.parse(dateString): 将字符串解析为 Date 对象实例,解析失败返回NaN,注意:由于浏览器差异和不一致,强烈建议不要使用 Date.parse 解析字符串。Date.UTC(year, month[, date[, hrs[, min[, sec[, ms]]]]]):距离零点时间的的毫秒数
时间字符串
在日常开发中经常会遇到需要将日期字符串转换为日期对象的场景,因为字符串的格式及浏览器实现等原因经常出现问题,按照 JavaScript 规范日期字符串应该是以下两种规范其中一种的实现:
- version of ISO8601
形式如:
YYYY-MM-DDTHH:mm:ss.sssZ即年-月-日T时:分:秒:毫秒时区T 为固定格式,表示日期和时间的分隔符 Z 表示时区,可以是:Z(UFC)、+HH:mm、-HH:mm - IETF-compliant RFC 2822 timestamps
比较复杂不建议使用,类似
Wed Mar 25 2015 09:56:24 GMT+0100
不建议直接使用Date相关方法进行字符串到日期的转换,建议使用工具或者先进行字符串分解再创建日期对象,例将YYYY-MMM-DD HH:mm:ss 格式字符串转换
function dateStringFormat(dateStr) {
var match = dateStr.match(/^(\d+)-(\d+)-(\d+) (\d+)\:(\d+)\:(\d+)$/);
let date = new Date(
match[1],
match[2] - 1,
match[3],
match[4],
match[5],
match[6]
);
}