博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript Date.parse 的小坑
阅读量:6910 次
发布时间:2019-06-27

本文共 1133 字,大约阅读时间需要 3 分钟。

TL;DR

new DateDate.parse 在格式化某些日期字符串的时候,时区具有不确定性,最好用 moment.js 这类工具去处理。

不确定的日期字符串

事情的起源是客户跟我说网页上的某个日期总是比实际日期少一天。经过一步步 debug 后发现问题在此:

js// 客户时区为美国东部时区夏令时new Date("2015-03-31")    // Mon Mar 30 2015 20:00:00 GMT-0400 (EDT)

明明写的 31 号,为什么生成的对象是 30 号的?因为 new Date 把它解析为 2015-03-31 00:00:00 ,时区为 UTC 。美国东部时区是减 4 小时的,于是就变成了前一天 20:00:00 。

那么 new Date 传入的时间字符串有没有规律可循呢?

混乱的规律

new DateDate.parse 使用的是同样的解析规律,只是一个返回 Date object 另一个返回毫秒数。为了方便查看结果,以下例子只用 new Date 。但请记住它们遵循一样的规律。

new Date 可以传入一个日期字符串来生成对象的,官方规定日期字符串需要符合 或者 的格式。拿上面的日期举个例子,前者可以写成 "Mar 31 2015" 后者可以写成 "2015-03-31" 。

如果日期字符串不符合这两种标准,new Date 对结果概不负责……

不过就算符合标准了,结果还是有点不同的。看几个例子:

jsnew Date("Mar 31 2015")    // Tue Mar 31 2015 00:00:00 GMT-0400 (EDT)new Date("2015-03-31")     // Mon Mar 30 2015 20:00:00 GMT-0400 (EDT)

RFC2822 的格式如果不带时区,new Date 会当做本地时区处理,而 ISO8601 格式则会当做 UTC 时区处理。

是有点绕人,但只要记住这个规律不就完了吗?骚年你太天真了…… 因为 ES6 草案为了简化这种情况,规定所有不带时区的字符串都默认为本地时区。注意这是草案,所以结果你懂的。

解决方案

一种解决方案是每次格式化日期都严格指定时区,以防止各种幺蛾子情况出现,比如:

jsnew Date("2015-03-31T00:00:00-04:00")    // Tue Mar 31 2015 00:00:00 GMT-0400 (EDT)

不过鉴于人都是懒惰的,这种情况交给工具做更靠谱,比如 moment.js 。

jsmoment("2015-03-31").toDate()

参考链接

转载地址:http://pzbcl.baihongyu.com/

你可能感兴趣的文章
快播创始人微博晒出团队合照
查看>>
mysql 登录退出命令
查看>>
对于设计模式最近观感的浅薄理解
查看>>
Spring中AOP使用——配置xml方式
查看>>
JavaScript是如何工作的:深入类和继承内部原理 + Babel和TypeScript 之间转换
查看>>
.net reactor使用教程(一)——界面各功能说明
查看>>
腾讯 AI Lab 正式开源PocketFlow,让深度学习放入手机!
查看>>
教你在Docker上不到2分钟建立一个多模型数据库!
查看>>
网络编程
查看>>
zookeeper选举机制
查看>>
python输入输出语句
查看>>
无法连接LINUX中的MYSQL
查看>>
HTTPS时代的到来是大势所趋!阿里云CDN如何助力企业网站进入HTTPS时代
查看>>
Linux 积极使用swap空间
查看>>
【云计算的1024种玩法】第1招:制作一个浪漫的表白网页
查看>>
对象转换为数组
查看>>
label与input的结合方式
查看>>
单点登录实现原理(SSO)
查看>>
Mui框架支持微信支付宝支付源代码
查看>>
文件和目录权限
查看>>