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

新手上路,请多包涵

我知道我可以用 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 可能是因为 1969 年 12 月 31 日是使用日光时间的日期……就是这样。

原文由 Leo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 990
2 个回答

此方法仅在总持续时间少于 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() ,但您还必须对它们进行零填充。

这是必要的,因为在 moment.js 中目前没有格式化 duration 反对的能力。 已在此处请求。但是,有一个名为 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"

原文由 Matt Johnson-Pint 发布,翻译遵循 CC BY-SA 3.0 许可协议

您的问题是在格式化之前将 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 这样的东西——尽管仅仅为了几个额外的零似乎还有很长的路要走。 :)

原文由 TML 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题