问题描述
在 chrome 控制台中输入 new Date('YYYY-MM-DD HH:mm:ss')
返回对应 Date
,而在 safari 中返回 Invalid Date
原因分析
ECMA-262 标准中(Date Time String Format)将日期格式规定为 YYYY-MM-DDTHH:mm:ss.sssZ
,其中,T
标识时间开始,Z
为相对于UTC(协调世界时 - International Atomic Time)的时间偏移量,可为 Z
, +HH:mm
或 -HH:mm
。
由此可见,各家浏览器在实现 Date
对象时只需要兼容标准中规定的格式,其他日期格式可根据自身需要实现。
在 chrome 浏览器中,Date()
将 YYYY-MM-DD HH:mm:ss
字符串解析为当地时间并生成对应 Date 对象,而 safari 浏览器则不支持该格式字符串的解析。
解决方案
根据协议,我们兼容各大浏览器时只需要将时间格式转化为 YYYY-MM-DDTHH:mm:ss.sssZ
即可。需要注意的是,使用这个格式生成的时间为 UTC 格式,与北京时间(CST)相差 8 个小时,所以在实际项目中,我们使用的时间格式为YYYY-MM-DDTHH:mm:ss.sss+08:00
。
当然,也可以使用时间转化函数,如下所示:
/**
* 将UTC时间转化为CST时间
* @param {Date} date
* @return {Date}
*/
function UTC2CST(date) {
return new Date(date.getTime() - 8 * 60 * 60 * 1000);
}