获取两个日期时间之间的时差

2022-08-30 00:17:37

我知道我可以做任何事情,并且用时刻js做一些更复杂的日期。但令人尴尬的是,我很难尝试做一些看似简单的事情:获得2次之间的差异。

例:

var now  = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";

//expected result:
"00:39:30"

我尝试了什么:

var now = moment("04/09/2013 15:00:00");
var then = moment("04/09/2013 14:20:30");

console.log(moment(moment.duration(now.diff(then))).format("hh:mm:ss"))
//outputs 10:39:30  

我不明白那里的“10”是什么。我住在巴西,所以如果相关的话,我们是utc-0300。

的结果是具有正确内部值的持续时间:moment.duration(now.diff(then))

 days: 0
 hours: 0
 milliseconds: 0
 minutes: 39
 months: 0
 seconds: 30
 years: 0

所以,我想我的问题是:如何将时刻js持续时间转换为时间间隔?我肯定可以使用

duration.get("hours") +":"+ duration.get("minutes") +:+ duration.get("seconds")

但我觉得有更优雅的东西,我完全错过了。

更新
仔细看,在上面的例子中是:now

Tue Apr 09 2013 15:00:00 GMT-0300 (E. South America Standard Time)…}

并且是:moment(moment.duration(now.diff(then)))

Wed Dec 31 1969 22:39:30 GMT-0200 (E. South America Daylight Time)…}

我不确定为什么第二个值是夏令时(-0200)...但我确信我不喜欢日期:(

更新 2

好吧,该值为-0200,可能是因为31/12/1969是使用夏令时的日期...就是这样。


答案 1

仅当总持续时间小于 24 小时时,此方法才有效:

var now  = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";

moment.utc(moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"))).format("HH:mm:ss")

// outputs: "00:39:30"

如果您有24小时或更长时间,则使用上述方法将重置为零,因此并不理想。

如果您想在 24 小时或更长时间内获得有效的响应,则必须执行如下操作:

var now  = "04/09/2013 15:00:00";
var then = "02/09/2013 14:20:30";

var ms = moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"));
var d = moment.duration(ms);
var s = Math.floor(d.asHours()) + moment.utc(ms).format(":mm:ss");

// outputs: "48:39:30"

请注意,我使用utc时间作为快捷方式。你可以单独拉出,但你也必须把它们从零点上移开。d.minutes()d.seconds()

这是必要的,因为格式化异议的能力目前还不是.js。这里已经要求了。但是,有一个名为“时刻-持续时间-格式”的第三方插件专门用于此目的:duration

var now  = "04/09/2013 15:00:00";
var then = "02/09/2013 14:20:30";

var ms = moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"));
var d = moment.duration(ms);
var s = d.format("hh:mm:ss");

// outputs: "48:39:30"

答案 2

您的问题在于在格式化之前将 moment.duration() 的结果传递回 moment();这导致 moment() 将其解释为相对于 Unix 时代的时间。

它不会给你你想要的格式,但是

moment.duration(now.diff(then)).humanize()

会给你一个有用的格式,如“40分钟”。如果你真的热衷于这种特定的格式,你必须自己构建一个新的字符串。一种便宜的方式是

[diff.asHours(), diff.minutes(), diff.seconds()].join(':')

哪里。这不会在单个数字值上为您提供零填充。为此,您可能需要考虑像underscore.string这样的东西 - 尽管仅仅为了几个额外的零似乎还有很长的路要走。:)var diff = moment.duration(now.diff(then))