274

我知道我可以用 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 日是使用日光时间的日期......就是这样。

4

21 回答 21

411

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

这是必要的,因为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"
于 2013-09-04T21:43:10.550 回答
75

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

于 2013-09-04T21:31:47.133 回答
71
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/中查看更多信息

于 2015-09-17T21:31:46.103 回答
35

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

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 分钟。

于 2016-01-08T07:53:46.140 回答
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持续时间的功能。或者您可以编写一个简单的包装器以使其更容易/更漂亮。

于 2013-09-04T21:30:03.377 回答
14

这应该可以正常工作。

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());
于 2017-07-12T15:53:54.663 回答
10

如果我们只想要 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;
}
于 2014-07-07T20:59:41.833 回答
5

用这个,

  var duration = moment.duration(endDate.diff(startDate));

    var aa = duration.asHours();
于 2019-01-27T06:39:28.623 回答
4

代替

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

最好这样做

moment.utc(total.asMilliseconds()).format("HH:mm:ss");
于 2013-09-07T14:59:59.333 回答
3

这适用于格式为 YYYY-MM-DD HH:mm:ss的任何日期

const moment=require("moment");
let startDate=moment("2020-09-16 08:39:27");
const endDate=moment();


const duration=moment.duration(endDate.diff(startDate))
console.log(duration.asSeconds());
 console.log(duration.asHours());
于 2020-09-16T08:41:32.960 回答
2

在 ES8 中使用 moment,now 和 start 成为 moment 对象。

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');
于 2017-11-13T05:24:05.747 回答
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;
};
于 2020-03-12T13:37:50.093 回答
1

基于日期时间的输入

    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
}
于 2019-01-08T06:05:02.330 回答
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

于 2017-09-03T22:02:43.770 回答
0

进场=06:38,出站=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);
    }
于 2018-07-25T08:33:02.583 回答
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

于 2020-05-27T17:00:33.593 回答
0

要获得两个时刻格式日期或 javascript 日期格式分钟差异之间的差异,最佳解决方案是

const timeDiff = moment.duration((moment(apptDetails.end_date_time).diff(moment(apptDetails.date_time)))).asMinutes()

您只需替换 asMinutes() 函数即可根据需要更改差异格式

于 2020-07-02T14:07:26.377 回答
0

如果您想要两个日期 ( startDate, endDate) 之间的本地化天数:

var currentLocaleData = moment.localeData("en");
var duration = moment.duration(endDate.diff(startDate));
var nbDays = Math.floor(duration.asDays()); // complete days
var nbDaysStr = currentLocaleData.relativeTime(returnVal.days, false, "dd", false);

nbDaysStr将包含“3天”之类的内容;

例如,有关如何显示小时数或月数的信息,请参阅https://momentjs.com/docs/#/i18n/changeing-locale/ 。

于 2020-08-12T18:40:49.493 回答
0

以下方法适用于所有情况(日期之间的差异小于 24 小时和大于 24 小时的差异):

// Defining start and end variables
let start = moment('04/09/2013 15:00:00', 'DD/MM/YYYY hh:mm:ss');
let end   = moment('04/09/2013 14:20:30', 'DD/MM/YYYY hh:mm:ss');

// Getting the difference: hours (h), minutes (m) and seconds (s)
let h  = end.diff(start, 'hours');
let m  = end.diff(start, 'minutes') - (60 * h);
let s  = end.diff(start, 'seconds') - (60 * 60 * h) - (60 * m);

// Formating in hh:mm:ss (appends a left zero when num < 10)
let hh = ('0' + h).slice(-2);
let mm = ('0' + m).slice(-2);
let ss = ('0' + s).slice(-2);

console.log(`${hh}:${mm}:${ss}`); // 00:39:30
于 2020-09-11T16:13:37.093 回答
0

这很简单,下面的代码将返回与当前 时间的小时差异:

moment().diff('2021-02-17T14:03:55.811000Z', "h")
于 2021-02-18T07:13:47.080 回答
0

这将返回最大的时间段差异,例如(4 秒、2 分钟、1 小时、2 天、3 周、4 个月、5 年)。我最近用它来通知。

function dateDiff(startDate, endDate) {
    let arrDate = ["seconds", "minutes", "hours", "days", "weeks", "months", "years"];
    let dateMap = arrDate.map(e => moment(endDate).diff(startDate, e));
    let index = 6 - dateMap.filter(e => e == 0).length;
    return {
        type: arrDate[index] ?? "seconds",
        value: dateMap[index] ?? 0
    };
}


例子:

dateDiff("2021-06-09 01:00:00", "2021-06-09 04:01:01")

{type: "hours", value: 3}

dateDiff("2021-06-09 01:00:00", "2021-06-12 04:01:01")

{type: "days", value: 3}

dateDiff("2021-06-09 01:00:00", "2021-06-09 01:00:10")

{type: "seconds", value: 10}

于 2021-06-14T06:56:10.920 回答