【问题标题】:moment fromNow returns in 5 hours when parsing utc解析 utc 时,时刻​​ fromNow 在 5 小时内返回
【发布时间】:2017-11-29 22:27:49
【问题描述】:

尝试使用 moment.js fromNow 及时从服务器格式化 utc 时间,但在某些情况下,我会得到“5 小时内”。

来自服务器的时间戳 - 2017-11-29T15:03:21

var utcTime = new Date(timestamp);
var timeAgo = moment(utcTime).fromNow();    
console.log(timeAgo)

所有日期都过去了,所以我该如何解决这个问题,以便我在几个小时内没有时间?

【问题讨论】:

  • 那么你想要什么? fromNow 返回的正是 documentation 声明它应该返回的内容。我不确定是什么混乱。也许您正在寻找difference
  • 我想在几秒钟前,几分钟前......而我在未来的 5 小时内到达。所以我想知道如何为时区格式化
  • 请注意,“2017-11-29T15:03:21”将被解析为本地,因此如果客户端时区与服务器的偏移量不同,它将代表不同的时间点。如果您希望将其视为 UTC,请将“Z”附加到时间戳:“2017-11-29T15:03:21Z”。您也可以使用moment(timestamp + 'Z').fromNow()

标签: javascript date datetime momentjs


【解决方案1】:

如果您希望将“2017-11-29T15:03:21”视为 UTC,您可以使用 moment 的 utc 方法或只是在字符串中附加一个“Z”。由于您已经在使用 moment.js,因此使用 moment.js 解析它比内置解析器更可靠:

var timestamp = "2017-11-30T00:20:48";

// Append Z
console.log(moment(timestamp + 'Z').fromNow());

// Use .utc
console.log(moment.utc(timestamp).fromNow());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.3/moment.min.js"></script>

【讨论】:

    【解决方案2】:

    您需要使用moment.utc 告诉 moment 这个日期是 UTC 格式

    var utcTime = new Date(timestamp);
    var timeAgo = moment.utc(utcTime).fromNow();
    

    如果您不这样做,moment 会假定此日期在您当地的时区(我可以通过偏移量判断为东部标准时间)。

    在您当地的时区,这个日期实际上是未来 5 小时。只有几秒钟前的 UTC,因为您的本地时区比 UTC 晚 5 小时。

    【讨论】:

      【解决方案3】:

      根据文件https://momentjs.com/docs/#/displaying/fromnow/

      您可以自定义语言环境https://momentjs.com/docs/#/customization/relative-time/

      作为默认语言环境future time 将是future: "in %s", 具有in,这是根据文档。如果您想更改它,请更新语言环境并根据需要使用。

      希望对你有帮助

      【讨论】:

      • 所有日期都是过去的,但由于我认为是 UTC,我将进入未来时间
      • 是的,这取决于您所在时区的哪一侧,您可能落后于 UTC 时间,这将是未来的时间。
      • 这个我明白了,怎么解决呢?
      • 所以要解决的问题是始终确保您要比较的时间在同一时区。将本地时间转换为 UTC 或将其他时间转换为本地时间以确保它提供正确的输出
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 2017-07-07
      • 1970-01-01
      • 2018-11-17
      • 2016-07-12
      相关资源
      最近更新 更多