时刻js总是返回零时间

时间:2018-03-25 13:38:06

标签: javascript datetime momentjs date-difference

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

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是有效的时刻对象。

2 个答案:

答案 0 :(得分:1)

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

例如:如果您将其称为moment.duration(100),则会创建100毫秒的持续时间。持续时间表示经过时间的跨度,或“时间量”。

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

  • 日期/时间代表日历中的特定点
  • 持续时间表示已用时间的跨度,并且未附加到日历中的任何特定点

您可以执行以下操作:

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

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

然后调用.asMilliseconds(),它返回持续时间所代表的总毫秒数。在这种情况下,它返回零。

然后你调用moment.utc()将上面的结果作为参数传递。换句话说,你和moment.utc(0)做的一样。将数字传递给utc()时,它会将此数字解释为“自Unix纪元以来的毫秒数”:https://momentjs.com/docs/#/parsing/utc/

当你传递零时,结果是Unix纪元本身,即1970年1月1日午夜

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

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

答案 1 :(得分:0)

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对象之间的差异。第二个参数是您想要返回的时间单位。