• 请不要在回答技术问题时复制粘贴 AI 生成的内容
millx
V2EX  ›  程序员

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

  •  
  •   millx · Jun 15, 2018 · 8578 views
    This topic created in 3067 days ago, the information mentioned may be changed or developed.

    开发 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 关于时间的格式定义的。

    51 replies  •  2018-06-16 15:59:09 +08:00
    wenzhoou
    wenzhoou
    Jun 15, 2018 via Android
    1
    改用 moment.js 怎么样
    hanpei
    hanpei
    Jun 15, 2018
    2
    t = new Date('2018/06/15 00:00:00')
    safari 这样可以
    以前也遇到过
    替换-为 /
    millx
    millx
    OP
    Jun 15, 2018
    3
    @wenzhoou 需求比较简单,注意到这个问题手动处理一下就好啦,不太喜欢引入太多 lib 😆
    cccRaim
    cccRaim
    Jun 15, 2018
    4
    我好像是 split(' ')分成日期和时间,然后再对日期 split('-')区分出年月日
    millx
    millx
    OP
    Jun 15, 2018
    5
    @hanpei 嗯,这样也可以,或者是把空格替换为 T
    opengps
    opengps
    Jun 15, 2018
    6
    遇到过-有问题,但是没深入研究,于是一直后台返回 2018/06/15 00:00:00 格式给前台 new Date('')。
    目前没发现问题
    Mutoo
    Mutoo
    Jun 15, 2018
    7
    这种必须前端后统一使用 IOS 8601,或者使用 UTC Timestamp 整数,不然遇到不同时区的时候,就蛋疼了。
    IOS 8601 的 T 部分是负责时区
    millx
    millx
    OP
    Jun 15, 2018
    8
    @opengps 后台 PHP 么? Python 里面 str(datetime.now()) 直接就是 '2018-06-15 11:23:06.674947' 这种格式
    grewer
    grewer
    Jun 15, 2018❤️1
    9
    以前碰到过,反正只要以'/'作为分割,那就没什么问题了
    Mutoo
    Mutoo
    Jun 15, 2018❤️1
    10
    @Mutoo 更正一下,Z 部分负责时区(可选)
    zjsxwc
    zjsxwc
    Jun 15, 2018
    11
    moment.js +1
    millx
    millx
    OP
    Jun 15, 2018
    12
    @Mutoo timestamp 可读性不太好 /(ㄒoㄒ)/~~
    agagega
    agagega
    Jun 15, 2018
    13
    同样的坑也出现在 iOS 平台的微信小程序里
    millx
    millx
    OP
    Jun 15, 2018
    14
    @agagega 就是不同 js 编译器有差异,容易被忽略
    jin5354
    jin5354
    Jun 15, 2018❤️1
    15
    原生 Date 兼容性问题多了,非 IOS 8601 标准格式,有的端直接报错,移动端某些版本还会出现 8 小时误差(不标 Z 的话有的按东八区算,有的按零时区算),如果跨端多非标准格式还是建议用个库
    zhouyg
    zhouyg
    Jun 15, 2018
    16
    建议覆盖掉原生 Date 类型,改为自己实现或模块
    zenxds
    zenxds
    Jun 15, 2018❤️2
    17
    new Date(时间戳)
    new Date('2014/07/12 12:34:35')
    new Date(year, month, day[, hour[, minute[, second[, millisecond]]]])

    其他的都有兼容问题
    millx
    millx
    OP
    Jun 15, 2018
    18
    @zenxds 统一用这几种就够了
    Cbdy
    Cbdy
    Jun 15, 2018 via Android
    19
    不要用时间戳数字,不要用奇奇怪怪的格式,数据传输统一用字符串,用 ISO8601 格式!
    kslr
    kslr
    Jun 15, 2018
    20
    用时间戳处理只有展示格式化可以避免很多奇怪的问题
    millx
    millx
    OP
    Jun 15, 2018
    21
    @Cbdy 时间戳除了可读性不好,其他应该还是没问题的 😆
    Cbdy
    Cbdy
    Jun 15, 2018 via Android
    22
    @millx 可读性是最严重的问题了,然后他是数字,“类型对不上”,还有诸如 2038 问题
    millx
    millx
    OP
    Jun 15, 2018
    23
    @Cbdy 也是,养成统一格式习惯可以省好多事儿
    doubleflower
    doubleflower
    Jun 15, 2018
    24
    没碰到过,从来不用这种感觉不牢靠的方式
    millx
    millx
    OP
    Jun 15, 2018
    25
    @doubleflower 你用哪种?
    royzxq
    royzxq
    Jun 15, 2018❤️1
    26
    ```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
    millx
    OP
    Jun 15, 2018
    27
    @royzxq 👍 不错
    doubleflower
    doubleflower
    Jun 15, 2018
    28
    @millx 我没用过中间有空格的,感觉不符标准
    zenio
    zenio
    Jun 15, 2018 via Android❤️1
    29
    把 - 换成 / 就可以了
    learnshare
    learnshare
    Jun 15, 2018
    30
    这不叫 Bug,是 Chrome 容错更强而已

    2018-06-15 00:00:00 这不是标准格式
    参考 https://zh.wikipedia.org/wiki/ISO_8601
    weixiangzhe
    weixiangzhe
    Jun 15, 2018❤️1
    31
    不是 bug 这个是兼容问题,推荐 dayjs 吧,api 兼容 momentjs,大小只有 2kb,https://github.com/iamkun/dayjs
    millx
    millx
    OP
    Jun 15, 2018
    32
    @learnshare 是的
    millx
    millx
    OP
    Jun 15, 2018
    33
    @weixiangzhe 这个赞,可以 locale 收藏了
    wwt2017
    wwt2017
    Jun 15, 2018
    34
    Safari 用 - 转化为毫秒时也会出问题
    auroraccc
    auroraccc
    Jun 15, 2018
    35
    平常用个 dayjs 就行了 , momentjs 好大
    zpf124
    zpf124
    Jun 15, 2018
    36
    ie 也有这个问题

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

    '2018-06-15 00:00:00' 报错。
    millx
    millx
    OP
    Jun 15, 2018
    37
    @auroraccc @royzxq 他的这个 parseDate 也不错
    millx
    millx
    OP
    Jun 15, 2018
    38
    @zpf124 应该都是老老实实按标准来实现的 哈哈哈
    mooo
    mooo
    Jun 15, 2018
    39
    第一种不规范啊, 规范只支持 RFC2822 和 ISO 8601 标准的
    metrxqin
    metrxqin
    Jun 15, 2018
    40
    **前端需要计算账号过期时间**

    你确定这种设计足够安全?
    millx
    millx
    OP
    Jun 15, 2018
    41
    @metrxqin 前端后端都需要啊,为什么不安全?
    millx
    millx
    OP
    Jun 15, 2018
    42
    @metrxqin 前端只是用来计算显示的啦,后端肯定需要自己重新计算的,不要太紧张 😆
    Cynic222
    Cynic222
    Jun 15, 2018 via iPhone
    43
    @wenzhoou #1 moment 太大,现在有个 dayjs,一样的 api
    ernest
    ernest
    Jun 15, 2018
    44
    ISO 8601 date string 格式了解下:2018-06-15T00:00:00 是 js Core 支持的。https://en.wikipedia.org/wiki/ISO_8601
    Building
    Building
    Jun 15, 2018 via iPhone❤️1
    45
    js 没有 bug,如果有的话,那是 feature。
    iamkun
    iamkun
    Jun 15, 2018❤️1
    46
    @millx 其实这几个时间字符串都不是标准时间,所以呢不同浏览器的支持情况是不一样的。 推荐前后统一用 ISO 时间或者时间戳,省心省力

    当然,欢迎体验 dayjs , 2kb 类似 moment.js 的时间库,欢迎提出各种改进意见。
    feder
    feder
    Jun 15, 2018
    47
    LS dayjs 作者
    wenzhoou
    wenzhoou
    Jun 15, 2018 via Android
    48
    恩。那我下次项目也用 dayjs
    millx
    millx
    OP
    Jun 15, 2018
    49
    @iamkun (*@ο@*) 哇~ dayjs 作者 😆
    scplay
    scplay
    Jun 16, 2018
    50
    第一次用 dayjs 发现 dayjs 没有解决 iso8601 在 safari 上的问题,果断换回 moment,
    iamkun
    iamkun
    Jun 16, 2018
    51
    @scplay 请问在 safari 上是什么问题呢
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1826 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 72ms · UTC 06:30 · PVG 14:30 · LAX 22:30 · JFK 01:30
    ♥ Do have faith in what you're doing.