我知道我可以使用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")


,但我觉得我完全不喜欢这种优雅的东西。

update
外观更近一点,在上面的示例中,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)...但是我确定我不喜欢日期:(

update 2

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

评论

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

#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(),但也必须将它们零位填充。

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


评论


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

–狮子座
13年4月4日在22:28

在找到此答案之前浪费了将近15分钟,感谢您提及“这种方法仅在总持续时间少于24小时时有效”

– Shehroz Ahmed
9月25日19:53

如何用C#编写呢?

–爱德华多·埃雷拉(Eduardo Herrera)
10月25日21:58

@EduardoHerrera-Moment是一个JavaScript库。如果您对C#中的类似问题有疑问,请提出一个新问题-不要在注释上附加任何内容。谢谢。

–马特·约翰逊·品特(Matt Johnson-Pint)
10月26日15:19

#2 楼

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

评论


您将不得不使用asHours而不是小时,并提取小数点。否则,它将遇到您在我的答案中遇到的相同问题。 :)

–马特·约翰逊·品特(Matt Johnson-Pint)
2013年9月4日在22:12



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

–狮子座
13年4月4日在22:31

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

–TML
2013年9月4日22:32在

请注意,明智地使用:[Math.floor(diff.asHours()),diff.minutes(),diff.seconds()]。join(':')以获得所需的结果。第一部分没有小数

–凯尔
17年8月2日在23:08



#3 楼

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希望有时间差

–apfz
2015年10月8日14:42

这是最简单的解决方案。是的,也带有时间戳。

– Faheem
19年4月6日在10:35

#4 楼

如果只想将两个时间戳记区别于总的天数,小时数和分钟数,而不是数月和数年。

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

#5 楼

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

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


所以,我认为这是应该的做法,因为moment.js在持续时间内不提供format函数。或者,您可以编写一个简单的包装程序,使其变得更容易/更美观。

#6 楼

这应该可以正常工作。
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());


#7 楼

如果只需要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;
}


评论


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

–乔尔
15年6月2日在16:24

#8 楼

代替

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


最好这样做

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


#9 楼

使用此,

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

    var aa = duration.asHours();


#10 楼

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


#11 楼

打字稿:以下应能奏效,

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


#12 楼

该格式适用于任何日期,格式为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());


#13 楼

基于日期的输入

    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
}


#14 楼

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

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

#15 楼

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


#16 楼

使用MOMENTJS的EPOCH时差:

获取两个时代之间的时差:

语法:
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

#17 楼

要获得两分钟格式的日期或javascript日期格式的分钟数之间的差异,最佳的解决方案是
const timeDiff = moment.duration((moment(apptDetails.end_date_time).diff(moment(apptDetails.date_time)))).asMinutes()

您可以通过替换asMinutes()函数来根据需要更改差异格式

#18 楼

如果您想要两个日期之间的本地化天数(startDateendDate):
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 / changing-locale /例如,有关如何显示小时数或月数的信息。

#19 楼

以下方法适用于所有情况(日期小于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