Moment js return 总是零时间

Moment js return always zero time

我正在尝试获取现在和未来时间之间的持续时间:

var d = moment.utc('27.03.2018 - 15:43:01', 'DD.MM.YYYY - HH:mm:ss')
var v = moment.utc(moment.duration(d).asMilliseconds()).format("HH:mm:ss")
console.log(v);

问题是 v 总是 00:00:00,为什么?

d 是有效的力矩对象。

var d = moment.utc('27.03.2018 - 15:43:01', 'DD.MM.YYYY - HH:mm:ss');
var v = d.diff(moment.utc(), 'milliseconds');

console.log(v);

您想使用 diff,因为它计算两个 date 对象之间的差异。第二个参数是你想要返回的时间单位。

调用duration(param)时,参数必须是文档中描述的值之一:https://momentjs.com/docs/#/durations/creating/

例如:如果您将其命名为 moment.duration(100),则会创建 100 毫秒的持续时间。持续时间表示经过的时间跨度,或 "amount of time".

如果您将日期对象传递给它 (moment.duration(d)),这就没有意义了。您正在尝试从日期值创建持续时间(经过时间的跨度)。这是对两个概念的误解:

  • a date/time 表示日历中的特定点
  • 持续时间表示经过时间的跨度,它不附加到日历中的任何特定点

您可以执行以下操作:

  • 计算两个日期之间的差异:结果是持续时间(今天上午 10 点到明天下午 2 点之间,差异 - 持续时间为 28 小时 - 不考虑 DST 影响:https://www.timeanddate.com/time/dst/transition.html)
  • add/subtract 日期的持续时间:今天上午 8 点,加上 2 小时的持续时间,等于今天上午 10 点

但是从一个日期创建一个持续时间,而没有另一个日期作为参考,是没有意义的。在这种特定情况下,瞬间决定 return 值为零的持续时间:打印 moment.duration(d) 的值,您将看到 P0T - 这是 ISO 8601 表示zero-duration: https://en.wikipedia.org/wiki/ISO_8601#Durations

然后调用 .asMilliseconds(),即 returns 持续时间表示的总毫秒数。在这种情况下,它是 returning 零。

然后你调用 moment.utc() 将上面的结果作为参数传递。换句话说,您正在做与 moment.utc(0) 相同的事情。当您将数字传递给 utc() 时,它会将此数字解释为 "the number of milliseconds since Unix epoch":https://momentjs.com/docs/#/parsing/utc/

当您传递零时,结果是 Unix 纪元本身,即 1970 年 1 月 1 日午夜(UTC)。

然后你调用.format("HH:mm:ss")打印小时、分钟和秒。由于 moment.utc(0) 是午夜,结果是 00:00:00.

如果您想计算两个日期之间的差异,请使用 Pavlo 的回答中解释的 diff 方法。