【问题标题】:wrong time with jquery timeago on safarisafari 上 jquery timeago 的错误时间
【发布时间】:2021-05-14 09:12:24
【问题描述】:

我一直在寻找解决方案,但我找不到。

我使用插件 jquery timeago https://timeago.yarp.com/ 将我的日期呈现为“x time ago”,并且在 chrome 上,firefox 运行良好,但在 safari 上除外。

在 safari 上,我比准确时间晚了 7 个小时。

但是,我用iso格式填写日期,还是不行。

这是我的代码:

let datetime = new Date(conversation.lastMessage.createdAt).toISOString();
let timeAgo = jQuery.timeago(datetime);

这是输出:

在 Safari 上(不正确):

conversation.lastMessage.createdAt // 2021/02/10 17:23:37
datetime // 2021-02-10T23:23:37.000Z
timeago // 7 hours ago

在 Firefox 上(正确):

conversation.lastMessage.createdAt // 2021/02/10 17:23:37
datetime // 2021-02-10T16:23:37.000Z
timeago // 1 minute ago

我指定时区是“欧洲/巴黎”。

谢谢。

【问题讨论】:

    标签: jquery datetime safari timezone


    【解决方案1】:

    一些事情:

    • 问题不在于 timeAgo,而在于您如何使用 Date 构造函数来解析您提供的字符串。

    • JavaScript 不直接支持您传入的字符串格式。而不是"2021/02/10 17:23:37" 应该是"2021-02-10T17:23:37" 请参阅ECMAScript 规范中的Date Time String Format

    • EMCAScript 规范also states

      ...如果字符串不符合该格式,则函数可能会退回到任何特定于实现的启发式或特定于实现的日期格式。 ...

      因此,当您将非标准格式传递给Date.parse 或作为字符串传递给Date 构造函数时,您可能会从不同的浏览器得到不同的结果。

    • 我无法解释 为什么 Safari 会给你这样的结果。该值似乎被解释为 UTC-6。您确定该计算机/设备的时区设置符合您的预期吗?

    • 然而,尽管有上述几点,Safari 在过去的版本中尤其错误地实现了 ECMAScript 规范。从 Safari 14 开始,"2021-02-10T17:23:37" 之类的字符串可以在本地时区正确解释。 Safari 13 及更早版本错误地将其解释为 UTC。

    因此,如果您想符合标准并且不需要支持旧版浏览器,那么您可以在解析之前调整输入字符串以匹配规范:

    const input = "2021/02/10 17:23:37";
    const d = new Date(input.replaceAll('/','-').replace(' ','T'));
    
    console.log(d.toString());
    console.log(d.toISOString());

    但是,如果您还想支持旧版浏览器,那么我建议您自己解析字符串:

    var re = /(\d{4})\/(\d{2})\/(\d{2}) (\d{2}):(\d{2}):(\d{2})/;
    var input = "2021/02/10 17:23:37";
    var a = input.match(re).slice(1, 7).map(x => +x);
    a[1]--; // months are 0-11
    var d = new Date(a[0], a[1], a[2], a[3], a[4], a[5]);
    
    console.log(d.toString());
    console.log(d.toISOString());

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-01
      相关资源
      最近更新 更多