开发 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 关于时间的格式定义的。
1
wenzhoou 2018-06-15 11:11:21 +08:00 via Android
改用 moment.js 怎么样
|
2
hanpei 2018-06-15 11:15:20 +08:00
t = new Date('2018/06/15 00:00:00')
safari 这样可以 以前也遇到过 替换-为 / |
4
cccRaim 2018-06-15 11:15:47 +08:00
我好像是 split(' ')分成日期和时间,然后再对日期 split('-')区分出年月日
|
6
opengps 2018-06-15 11:19:15 +08:00
遇到过-有问题,但是没深入研究,于是一直后台返回 2018/06/15 00:00:00 格式给前台 new Date('')。
目前没发现问题 |
7
Mutoo 2018-06-15 11:23:07 +08:00
这种必须前端后统一使用 IOS 8601,或者使用 UTC Timestamp 整数,不然遇到不同时区的时候,就蛋疼了。
IOS 8601 的 T 部分是负责时区 |
8
millx OP @opengps 后台 PHP 么? Python 里面 str(datetime.now()) 直接就是 '2018-06-15 11:23:06.674947' 这种格式
|
9
grewer 2018-06-15 11:23:56 +08:00 1
以前碰到过,反正只要以'/'作为分割,那就没什么问题了
|
11
zjsxwc 2018-06-15 11:25:22 +08:00
moment.js +1
|
13
agagega 2018-06-15 11:28:50 +08:00
同样的坑也出现在 iOS 平台的微信小程序里
|
15
jin5354 2018-06-15 11:34:05 +08:00 1
原生 Date 兼容性问题多了,非 IOS 8601 标准格式,有的端直接报错,移动端某些版本还会出现 8 小时误差(不标 Z 的话有的按东八区算,有的按零时区算),如果跨端多非标准格式还是建议用个库
|
16
zhouyg 2018-06-15 11:35:21 +08:00
建议覆盖掉原生 Date 类型,改为自己实现或模块
|
17
zenxds 2018-06-15 11:36:02 +08:00 2
new Date(时间戳)
new Date('2014/07/12 12:34:35') new Date(year, month, day[, hour[, minute[, second[, millisecond]]]]) 其他的都有兼容问题 |
19
Cbdy 2018-06-15 11:55:43 +08:00 via Android
不要用时间戳数字,不要用奇奇怪怪的格式,数据传输统一用字符串,用 ISO8601 格式!
|
20
kslr 2018-06-15 11:57:35 +08:00
用时间戳处理只有展示格式化可以避免很多奇怪的问题
|
24
doubleflower 2018-06-15 12:32:12 +08:00
没碰到过,从来不用这种感觉不牢靠的方式
|
25
millx OP @doubleflower 你用哪种?
|
26
royzxq 2018-06-15 12:34:58 +08:00 1
```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, ' ')) } ``` |
28
doubleflower 2018-06-15 12:40:55 +08:00
@millx 我没用过中间有空格的,感觉不符标准
|
29
kefengong 2018-06-15 12:59:02 +08:00 via Android 1
把 - 换成 / 就可以了
|
30
learnshare 2018-06-15 13:06:12 +08:00
|
31
weixiangzhe 2018-06-15 13:14:27 +08:00 1
不是 bug 这个是兼容问题,推荐 dayjs 吧,api 兼容 momentjs,大小只有 2kb,https://github.com/iamkun/dayjs
|
32
millx OP @learnshare 是的
|
33
millx OP @weixiangzhe 这个赞,可以 locale 收藏了
|
34
wwt2017 2018-06-15 13:20:48 +08:00
Safari 用 - 转化为毫秒时也会出问题
|
35
auroraccc 2018-06-15 15:12:33 +08:00
平常用个 dayjs 就行了 , momentjs 好大
|
36
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' 报错。 |
39
mooo 2018-06-15 16:19:34 +08:00
第一种不规范啊, 规范只支持 RFC2822 和 ISO 8601 标准的
|
40
metrxqin 2018-06-15 16:29:12 +08:00
**前端需要计算账号过期时间**
你确定这种设计足够安全? |
44
ernest 2018-06-15 16:41:53 +08:00
ISO 8601 date string 格式了解下:2018-06-15T00:00:00 是 js Core 支持的。https://en.wikipedia.org/wiki/ISO_8601
|
45
Building 2018-06-15 16:47:32 +08:00 via iPhone 1
js 没有 bug,如果有的话,那是 feature。
|
46
iamkun 2018-06-15 17:17:04 +08:00 1
@millx 其实这几个时间字符串都不是标准时间,所以呢不同浏览器的支持情况是不一样的。 推荐前后统一用 ISO 时间或者时间戳,省心省力
当然,欢迎体验 dayjs , 2kb 类似 moment.js 的时间库,欢迎提出各种改进意见。 |
47
feder 2018-06-15 17:31:47 +08:00
LS dayjs 作者
|
48
wenzhoou 2018-06-15 18:22:16 +08:00 via Android
恩。那我下次项目也用 dayjs
|
50
scplay 2018-06-16 09:38:03 +08:00
第一次用 dayjs 发现 dayjs 没有解决 iso8601 在 safari 上的问题,果断换回 moment,
|