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

IT技术 javascript date time momentjs difference
2021-01-18 21:44:09

我知道我可以用 momentjs 做任何事情,甚至可以做一些更复杂的日期。但令人尴尬的是,我很难尝试做一些看起来很简单的事情:找出 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

所以,我想我的问题是:如何将 momentjs Duration 转换为时间间隔?我肯定可以用

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 是使用夏令时的日期......就是这样。

6个回答

此方法仅在总持续时间少于 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()分开,但你也必须ZEROPAD他们。

这是必要的,因为duration目前在 moment.js 中没有格式化反对意见的能力已在此处请求但是,有一个名为moment-duration-format的第三方插件专门用于此目的:

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"
怎么用c#写这个?
2021-03-11 21:44:09
@EduardoHerrera - Moment 是一个 JavaScript 库。如果您对 C# 中的类似内容有疑问,请提出一个新问题- 不要链接到评论。谢谢。
2021-03-17 21:44:09
这工作得很好。momentjs 是一个如此优雅的库,它让我感到惊讶,它没有更简单的方法,但也许我所做的并不是那么“正常”。我可能不会超过 24 小时,但如果发生这种情况,有选择权是很好的。谢谢你的帮助。
2021-03-29 21:44:09
在找到这个答案之前浪费了将近 15 分钟,感谢您提到“此方法仅在总持续时间少于 24 小时时有效”
2021-03-31 21:44:09

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

它没有为您提供您正在寻找的确切格式,但是

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

会给你一个有用的格式,比如“40分钟”。如果您真的很喜欢这种特定格式,则必须自己构建一个新字符串。一个便宜的方法是

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

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

感谢您指出这一点,@MattJohnson - 我什至没有意识到 .asHours 和 .hours 是不同的,以为一个只是另一个的较短名称,但仔细检查后,你是对的。
2021-03-15 21:44:09
请注意,明智的做法是使用: [Math.floor(diff.asHours()), diff.minutes(), diff.seconds()].join(':')以获得所需的结果。第一部分没有小数
2021-03-18 21:44:09
你必须使用asHours而不是hours, 并去掉小数点。否则它会遇到与您在我的回答中遇到的相同问题。:)
2021-03-19 21:44:09
humanize() 给人一种很好的感觉,但我最终使用了马特的建议。谢谢你的提示。
2021-04-03 21:44:09
var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days') //[days, years, months, seconds, ...]
//Result 1 

为我工作

http://momentjs.com/docs/#/displaying/difference/ 中查看更多信息

这仅适用于日期。OP想要有时差
2021-03-24 21:44:09
这是最简单的解决方案。是的,也有时间戳。
2021-04-09 21:44:09

如果您只想将两个时间戳的差异分为总天数、小时数和分钟数,而不是月数和年数。

var now  = "01/08/2016 15:00:00";
var then = "04/02/2016 14:20:30";
var diff = moment.duration(moment(then).diff(moment(now)));

diff 包含 2 个月 23 天 23 小时 20 分钟。但是我们只需要几天、几小时和几分钟的结果,所以简单的解决方案是:

var days = parseInt(diff.asDays()); //84

var hours = parseInt(diff.asHours()); //2039 hours, but it gives total hours in given miliseconds which is not expacted.

hours = hours - days*24;  // 23 hours

var minutes = parseInt(diff.asMinutes()); //122360 minutes,but it gives total minutes in given miliseconds which is not expacted.

minutes = minutes - (days*24*60 + hours*60); //20 minutes.

最终结果将是:84 天 23 小时 20 分钟。

当您调用 时diff,moment.js 以毫秒为单位计算差异。如果将毫秒传递给duration,则用于计算正确的持续时间。然而。当您将相同的毫秒数传递给 时moment(),它计算的日期是 1970 年 1 月 1 日(UTC/GMT 午夜)纪元/unix 时间(之后)的毫秒数。这就是为什么您将 1969 年与错误的时间在一起。

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

所以,我认为这是你应该做的,因为 moment.js 不提供format持续时间的功能。或者您可以编写一个简单的包装器以使其更容易/更漂亮。