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