这个 js bug 应该大家都碰到过吧?

2018-06-15 11:06:13 +08:00
 millx

开发 bufpay.com 个人收款接口 的时候,前端需要计算账号过期时间。直接用了:

var t = new Date('2018-06-15 00:00:00');

这样来初始化,在 Chrome 里面是没问题的,但是 Safari 里面就不行了,发现 Safari 支持 :

var t = new Date('2018-06-15');

和这样

var t = new Date('2018-06-15T00:00:00');

Chrome 里面是上面三种格式初始化都支持的。

这个 bug (应该也不能算 Safari 的 bug )应该是 Chrome 做了兼容,Safari 是符合 ECMAScript IOS 8601 关于时间的格式定义的。

7115 次点击
所在节点    程序员
51 条回复
millx
2018-06-15 11:59:57 +08:00
@Cbdy 时间戳除了可读性不好,其他应该还是没问题的 😆
Cbdy
2018-06-15 12:06:48 +08:00
@millx 可读性是最严重的问题了,然后他是数字,“类型对不上”,还有诸如 2038 问题
millx
2018-06-15 12:10:02 +08:00
@Cbdy 也是,养成统一格式习惯可以省好多事儿
doubleflower
2018-06-15 12:32:12 +08:00
没碰到过,从来不用这种感觉不牢靠的方式
millx
2018-06-15 12:34:56 +08:00
@doubleflower 你用哪种?
royzxq
2018-06-15 12:34:58 +08:00
```js
function parseDate(date) {
if (!date) return new Date()
if (date instanceof Date) return date
if (!/[^\d]+/g.test(date)) {
date = date.toString().concat('000').substr(0, 13) * 1

return new Date(date)
}

return new Date(date.toString().replace(/-/g, '/').replace(/T|(?:\.\d+)?Z/g, ' '))
}
```
millx
2018-06-15 12:38:10 +08:00
@royzxq 👍 不错
doubleflower
2018-06-15 12:40:55 +08:00
@millx 我没用过中间有空格的,感觉不符标准
kefengong
2018-06-15 12:59:02 +08:00
把 - 换成 / 就可以了
learnshare
2018-06-15 13:06:12 +08:00
这不叫 Bug,是 Chrome 容错更强而已

2018-06-15 00:00:00 这不是标准格式
参考 https://zh.wikipedia.org/wiki/ISO_8601
weixiangzhe
2018-06-15 13:14:27 +08:00
不是 bug 这个是兼容问题,推荐 dayjs 吧,api 兼容 momentjs,大小只有 2kb,https://github.com/iamkun/dayjs
millx
2018-06-15 13:17:10 +08:00
@learnshare 是的
millx
2018-06-15 13:19:21 +08:00
@weixiangzhe 这个赞,可以 locale 收藏了
wwt2017
2018-06-15 13:20:48 +08:00
Safari 用 - 转化为毫秒时也会出问题
auroraccc
2018-06-15 15:12:33 +08:00
平常用个 dayjs 就行了 , momentjs 好大
zpf124
2018-06-15 15:19:01 +08:00
ie 也有这个问题

'2018-06-15' 正确
'2018/06/15 00:00:00' 正确

'2018-06-15 00:00:00' 报错。
millx
2018-06-15 16:02:47 +08:00
@auroraccc @royzxq 他的这个 parseDate 也不错
millx
2018-06-15 16:03:13 +08:00
@zpf124 应该都是老老实实按标准来实现的 哈哈哈
mooo
2018-06-15 16:19:34 +08:00
第一种不规范啊, 规范只支持 RFC2822 和 ISO 8601 标准的
metrxqin
2018-06-15 16:29:12 +08:00
**前端需要计算账号过期时间**

你确定这种设计足够安全?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/463322

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX