【问题标题】:Moment JS function `moment()` returning a different date/time on different devicesMoment JS 函数`moment()` 在不同的设备上返回不同的日期/时间
【发布时间】:2021-05-04 04:24:33
【问题描述】:

在我的 React Native 应用程序中,我使用 moment JS 计算给定时间与当前时间之间的差异。我计算minsLeft的代码,两次之差,是:

let minsLeft = moment.duration(moment(request.AcceptedDate, "DD-MMM-YYYY h:mm:ss A")
      .subtract(new Date().getTimezoneOffset(), 'minutes')
      .add(request.ETA, 'minutes')
      .diff(moment())
)

request.AcceptedDate3-May-2020 04:37:31 PM,那天(5 月 3 日)下午 5 点,我得到了 23 分钟的结果,正如预期的那样。不过,在某些设备上,我得到的值为负几千分钟。这些数字与将当前日期计算为05/03/2021 而不是03/05/2021 的应用程序一致,好像moment() 函数在不同设备上返回的内容不同。

有没有人遇到过这样的事情并知道这种差异可能来自哪里?

【问题讨论】:

    标签: javascript reactjs react-native datetime momentjs


    【解决方案1】:

    我也遇到了同样的问题。原来 moment() 函数取决于设备上设置的时区、日期和时间。当您更改时间或日期或时区时,您会得到不同的结果。

    【讨论】:

    • 您能详细说明您的发现吗?
    【解决方案2】:
    var now  = "04/05/2021 11:00:00"; //new Date();
    var then = "03/05/2021 11:20:00";
    
    var s = moment.utc(moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"))).format("HH:mm:ss");
    console.log("s:", s); 
    //output: 23:40:00
    

    使用矩获取两次之间的差异。希望它适用于本机反应。我在反应中尝试过。

    【讨论】:

      【解决方案3】:

      问题在于时区和格式。

      考虑到您的要求是:

      让请求 = {AcceptedDate: '06-May-2021 11:03:28 AM', ETA:60}

      根据您的评论,AcceptedDate 的格式为 DD-MMM-YYYY h:mm:ss A,并且已经是 UTC 时间。

      这里有 2 种不同的方法来解决您的问题:

      方法一:使用new Date().getTimezoneOffset()

      let minsLeft =  Math.abs(moment(request_TimeStamp.AcceptedDate).subtract(new Date().getTimezoneOffset(), 'minutes').add(request_TimeStamp.ETA, 'minutes').diff(moment(), 'minutes'))
      

      方法二:使用moment().local()

      let minsLeft = Math.abs(moment(request_TimeStamp.AcceptedDate).utc(request_TimeStamp.AcceptedDate).local().add(request_TimeStamp.ETA, 'minutes').diff(moment(), 'minutes'))
      

      我用上述两种方法创建了一个Snack

      如果我的解决方案对您有任何帮助,请投票并标记。 干杯!

      【讨论】:

      • @manjish 检查我的解决方案。它经过良好测试!还要找到整个实现所在的 Snack
      • 您好,Gavin,感谢您的回复。 AcceptedDate 的格式为“DD-MMM-YYYY h:mm:ss A”,例如 3-May-2020 04:37:31 PM。它实际上已经在 UTC 时间,所以我减去 timezoneOffset 的原因是为了让它回到用户的本地时间。我了解您所包含的代码,但我不明白此修复的原始代码可能存在什么问题。我认为你的代码和我的代码之间的唯一区别是你做.utc(),我做getTimezoneOffset,你做Math.abs,我做asMinutes()。这些都给出了相同的结果。任何进一步的见解?
      • 更新:嘿@gkeenley,我已经根据您的评论更新了我的解决方案“AcceptedDate 的格式为“DD-MMM-YYYY h:mm:ss A”,就像 2020 年 5 月 3 日04:37:31 PM。实际上已经是 UTC 时间了”。我已经测试了我的更新解决方案,还更新了上述答案中的图像和小吃。看看并为我的答案 +1 投票。需要帮助请叫我。乐于助人!
      • 如果我的解决方案正确回答了您的问题,请将我的解决方案标记为答案.....
      • 我已经投了赞成票,一旦我确认这可以解决我的问题,我就会接受。这两个计算给我的输出与我现有的代码相同。我想知道的是我的代码中是否有某些内容可能会在不同的设备上提供不同的输出,如果是,您的代码是否避免了该问题并且在设备之间保持一致。
      猜你喜欢
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 2022-12-14
      • 2014-05-01
      • 2017-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多