Date 对象
关于 Date 对象,有几个方法总是记不住或者记混淆的,所以写篇文章整理一下。
关于 GTM(格林威治时间)和 UTC(世界标准时间)的区别,可以看文章末尾引用的文章
Date
在 ECMAScript 中,Date 类型使用自世界标准时间(UTC)1970-1-1 00:00:00 开始经过的毫秒数来保存日期。
// 获取起始时间
const date = new Date(0)
// Thu Jan 01 1970 08:00:00 GMT+0800 (中国标准时间)
创建 Date 两种方式:
// 字符串类型
const date = Date()
console.log(typeof date) // string
// 对象类型(常用)
const date = new Date()
console.log(typeof date) // object
Date Get 方法
下面以 2020 年 12 月 03 日为例:
-
getTime()
返回 1970 年 1 月 1 日零时至今的毫秒数。 -
getFullYear()
返回 4 位数的年份(如 2020)。 -
getMonth()
返回月份,值为0~11
分别表示 1 月到 12 月。所以一般获取月份都要加一。 -
getDate()
返回一个月的某天,值为1~31
分别表示 1日到 31 日。 -
getDay()
返回一周的某天,值为0~6
分别表示周日、周一到周六。 -
getHours()
返回小时数,值为0 ~ 23
。 -
getMinutes()
返回分钟数,值为0 ~ 59
。 -
getSeconds()
返回秒数,值为0 ~ 59
。 -
getMilliseconds()
返回毫秒数,值为0 ~ 999
。
getYear()
方法在 Web 标准中已被删除,尽管某些浏览器仍然支持它,但建议不要用了!因为它在不同浏览器的表现不一样。像 Chrome、Safari、FireFox 返回的是当前年份 - 1900
的值。而在 IE 浏览器上,当当前年份大于等于 2000 时,返回值是当前 4 位数年份。 👉 MDN Date.getYear()
Date Set 方法
-
setTime()
以毫秒设置 Date 对象(参数:毫秒数
) -
setDate()
根据本地时间设置 Date 对象中月的某一天(合理参数:1 ~ 31
,分别表示 1 ~ 31 日)如果参数超出合理范围,会相对应的更新 Date 对象。
- 参数为
0
时,则设置为上个月的最后一天。 - 参数为
负数
时,则设置为上个月最后一天往前数这个负数绝对值天数后的日期。例如:-1
会设置为上月最后一天的前一天。 - 参数为
超过当前月最大的天数
时,则超出天数(参数值 - 当前月天数
)设置为下个月对应日期。例如:当前 Date 为 4 月,当参数为 32 时,则日期被设置为 5 月 2 日。
下列 Set 方法同理。
- 参数为
-
setMonth()
根据本地时间设置 Date 对象中月份(参数:0 ~ 11
,分别表示 1 ~ 12 月份)
-
setFullYear()
根据本地时间设置 Date 对象中的年份(参数:4 位数字年份
)同样 setYear() 已从 Web 标准中删除,不建议使用。
-
setMilliseconds()
根据本地时间设置 Date 对象中的毫秒数(参数:0 ~ 999
)超出合理范围,日期对象的时间会相应地更更新。例如 1005,秒数加 1,毫秒数为 5。
-
setSeconds()
根据本地时间设置 Date 对象中的秒数(参数:0 ~ 59
)超出合理范围,日期对象的时间会相应地更更新。例如 100,分钟数加 1,秒数为 40。
-
setMinutes()
根据本地时间设置 Date 对象中的秒数(参数:0 ~ 59
)超出合理范围,日期对象的时间会相应地更更新。例如 60,小时数加 1,秒数为 0。
-
setHours()
根据本地时间设置 Date 对象中的小时数(参数:0 ~ 23
)超出合理范围,日期对象的时间会相应地更更新。例如 24,天数加 1,小时数为 0。
UTC 时间
上述所讲的 Get 和 Set 方法是针对本地时区时间去获取、设置时间的。而 Date 同样提供了获取、设置 UTC 时间,方法如:getUTCMonth()
、setUTCMonth()
等等。实践过程中,比较少涉及 UTC 时间,所以不展开赘述。可以偷偷点这里去了解。
Date 其他方法
-
Date.now()
返回自 1970-1-1 00:00:00(UTC)到当前时间的毫秒数。
-
Date.prototype.toString()
、Date.prototype.toTimeString()
、Date.prototype.toDateString()
返回值是以美式英语和人类易读的形式返回日期对象的格式化字符串。该字符串由日期部分(年月日)和时间部分(时分秒及时区)组成。
const date = new Date()
date.toString() // "Thu Dec 03 2020 18:19:17 GMT+0800 (中国标准时间)"
date.toDateString() // "Thu Dec 03 2020"
date.toTimeString() // "18:19:17 GMT+0800 (中国标准时间)"
-
Date.parse()
、Date.prototype.getTime()
、Date.prototype.valueOf()
它们都返回 1970-1-1 00:00:00(UTC)到指定日期的毫秒数。但是它们还是有区别的。前者精确到秒,而后两者是精确到毫秒。
const date = new Date('5/24/2020')
date.setMilliseconds(45) // 设置毫秒数
console.log(date.getTime()) // 1590249600045
console.log(date.valueOf()) // 1590249600045
console.log(Date.parse(date)) // 1590249600000
兼容性
类似 new Date('xxxx/xx/xx xx:xx:xx')
形式的时间对象在 IOS 和 Andriod 系统上都可以被正确的识别,而类似 new Date('xxxx-xx-xx xx:xx:xx')
形式的时间对象在 iOS 系统上无法被正确的识别,需要做一层转化。
const date = new Date('xxxx-xx-xx xx:xx:xx'.replace(/-/g, '/'))