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


246

我知道我可以使用momentjs做任何事情,还可以做一些涉及日期的事情。但是令人尴尬的是,我很难去做一件看起来很简单的事情:得到两次之间的差。

例:

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


2
“但是我确定我不喜欢约会”:P您读过此书nodatime.org/unstable/userguide/trivia.html吗?
鲍里斯·卡伦斯

Answers:


366

仅当总持续时间少于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他们。

这是必要的,因为durationmoment.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"

31
@TML-我明确地说过,它不能在24小时或更长时间内正常工作。
马特·约翰逊

1
这很好。momentjs是一个如此优雅的库,令我惊讶的是它没有更简单的方法,但是也许我做的并不是那么“正常”。我可能不会有超过24小时的时间,但是如果发生这种情况,很高兴可以选择。谢谢你的帮助。
狮子座

69

您的问题是在格式化之前将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之类的东西-尽管似乎只需要几个零即可。:)


4
您必须使用asHours代替hours,并提取小数点。否则,它将遇到您在我的答案中遇到的相同问题。:)
马特·约翰逊·品脱

humanize()给人很好的印象,但我最后还是使用了Matt建议。谢谢你的提示。
狮子座

感谢您指出@MattJohnson-我什至都没有意识到.asHours和.hours是不同的,以为一个只是另一个的简称,但是仔细检查,您是正确的。
TML

2
注意,明智的做法是使用: [Math.floor(diff.asHours()), diff.minutes(), diff.seconds()].join(':')以获得所需的结果。在第一部分中没有小数点
KyleM '17


30

如果只想将两个时间戳记相差仅几天,几小时和几分钟,而不是几个月和几年。

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)));

差异包含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分钟。


19

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

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

因此,我认为这是您应该采取的措施,因为moment.js并未提供format持续时间的功能。或者,您可以编写一个简单的包装程序以使其更容易/更美观。


11

这应该工作正常。

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);

console.log(d.days(), d.hours(), d.minutes(), d.seconds());

更好的解决方案!:)
JHenry

有史以来最好的解决方案
Alaksandar Jesus Gene

9

如果只需要hh:mm:ss,则可以使用如下函数:

//param: duration in milliseconds
MillisecondsToTime: function(duration) {
    var seconds = parseInt((duration/1000)%60)
        , minutes = parseInt((duration/(1000*60))%60)
        , hours = parseInt((duration/(1000*60*60))%24)
        , days  = parseInt(duration/(1000*60*60*24));

    var hoursDays = parseInt(days*24);
    hours += hoursDays;
    hours = (hours < 10) ? "0" + hours : hours;
    minutes = (minutes < 10) ? "0" + minutes : minutes;
    seconds = (seconds < 10) ? "0" + seconds : seconds;
    return hours + ":" + minutes + ":" + seconds;
}

4
在您回答的任何地方,我都看不到片刻用法。
2015年


3

代替

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

最好做

moment.utc(total.asMilliseconds()).format("HH:mm:ss");

2

在ES8中使用矩,现在开始成为矩对象。

const duration = moment.duration(now.diff(start));
const timespan = duration.get("hours").toString().padStart(2, '0') +":"+ duration.get("minutes").toString().padStart(2, '0') +":"+ duration.get("seconds").toString().padStart(2, '0');

2

打字稿:以下应该有效,

export const getTimeBetweenDates = ({
  until,
  format
}: {
  until: number;
  format: 'seconds' | 'minutes' | 'hours' | 'days';
}): number => {
  const date = new Date();
  const remainingTime = new Date(until * 1000);
  const getFrom = moment([date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()]);
  const getUntil = moment([remainingTime.getUTCFullYear(), remainingTime.getUTCMonth(), remainingTime.getUTCDate()]);
  const diff = getUntil.diff(getFrom, format);
  return !isNaN(diff) ? diff : null;
};

0

我用打字稿创建一个简单的函数

const diffDuration: moment.Duration = moment.duration(moment('2017-09-04 12:55').diff(moment('2017-09-02 13:26')));
setDiffTimeString(diffDuration);

function setDiffTimeString(diffDuration: moment.Duration) {
  const str = [];
  diffDuration.years() > 0 ? str.push(`${diffDuration.years()} year(s)`) : null;
  diffDuration.months() > 0 ? str.push(`${diffDuration.months()} month(s)`) : null;
  diffDuration.days() > 0 ? str.push(`${diffDuration.days()} day(s)`) : null;
  diffDuration.hours() > 0 ? str.push(`${diffDuration.hours()} hour(s)`) : null;
  diffDuration.minutes() > 0 ? str.push(`${diffDuration.minutes()} minute(s)`) : null;
  console.log(str.join(', '));
} 
// output: 1 day(s), 23 hour(s), 29 minute(s)

用于生成javascript https://www.typescriptlang.org/play/index.html


0

InTime = 06:38,Outtime = 15:40

 calTimeDifference(){
        this.start = dailyattendance.InTime.split(":");
        this.end = dailyattendance.OutTime.split(":");
        var time1 = ((parseInt(this.start[0]) * 60) + parseInt(this.start[1]))
        var time2 = ((parseInt(this.end[0]) * 60) + parseInt(this.end[1]));
        var time3 = ((time2 - time1) / 60);
        var timeHr = parseInt(""+time3);
        var  timeMin = ((time2 - time1) % 60);
    }

0

基于日期的输入

    var dt1 = new Date("2019-1-8 11:19:16");
    var dt2 = new Date("2019-1-8 11:24:16");


    var diff =(dt2.getTime() - dt1.getTime()) ;
    var hours = Math.floor(diff / (1000 * 60 * 60));
    diff -= hours * (1000 * 60 * 60);
    var mins = Math.floor(diff / (1000 * 60));
    diff -= mins * (1000 * 60);


    var response = {
        status : 200,
        Hour : hours,
        Mins : mins
    }

输出值

{
"status": 200,
"Hour": 0,
"Mins": 5
}

0

使用MOMENTJS的时差

要获得两个时代之间的差异:

句法: moment.duration(moment(moment(date1).diff(moment(date2)))).asHours()

时差: moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asHours()

分钟差异: moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asMinutes().toFixed()

注意:.toFixed()如果需要精确值,可以删除。

码:

const moment = require('moment')

console.log('Date 1',moment(1590597909877).toISOString())
console.log('Date 2',moment(1590597744551).toISOString())
console.log('Date1 - Date 2 time diffrence is : ',moment.duration(moment(moment(1590597909877).diff(moment(1590597744551)))).asMinutes().toFixed()+' minutes')

请在此处参考工作示例: https : //repl.it/repls/MoccasinDearDimension

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.