在 Moment Js 中获取两个日期之间的小时差

Posted

技术标签:

【中文标题】在 Moment Js 中获取两个日期之间的小时差【英文标题】:Get hours difference between two dates in Moment Js 【发布时间】:2014-09-28 19:25:15 【问题描述】:

我可以使用 MomentJs 获得两个日期之间的差异,如下所示:

moment(end.diff(startTime)).format("m[m] s[s]")

但是,我还想在适用时显示小时(仅当 >= 60 分钟过去时)。

但是,当我尝试使用以下方法检索持续时间时:

var duration = moment.duration(end.diff(startTime));
var hours = duration.hours();

它返回的是当前小时,而不是两个日期之间的小时数。

如何获得两个 Moments 之间的小时数差异?

【问题讨论】:

【参考方案1】:

也许对某人有用

          var ax = moment(
            new Date().toLocaleString(), // today/now is 09/12/2021 10:00:00
            "DD/MM/YYYY HH:mm:ss"
            ).diff(
              moment(
                "12/11/2022 13:43:11", // some time in future or past
                "DD/MM/YYYY HH:mm:ss"
              )
          );
          console.log('if today is in the future of the compared date then 
          result should be negative ==>', ax);
          // ax bigger than 0 zero means date in past. ms less than zero is in future

【讨论】:

【参考方案2】:

你只需要在 moment.js 中使用 date.diff() 方法

const now = moment.utc();
var end = moment("2021-09-13"); 
var days = now.diff(end, "days"); 
console.log(days)
<script src="https://momentjs.com/downloads/moment.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

【讨论】:

【参考方案3】:

根据 Moment JS的新弃用警告

您需要传递开始日期格式和结束日期格式以及值,例如:

   let trackStartTime = "2020-12-29 09:59:19.07 +05:30";
   let trackEndTime = "2020-12-29 11:04:19.07 +05:30" || moment().format("YYYY-MM-DD HH:mm:ss.SS Z");
   let overallActivity = moment.duration(moment(trackEndTime, 'YYYY-MM-DD HH:mm:ss.SS Z').diff(moment(trackStartTime, 'YYYY-MM-DD HH:mm:ss.SS Z'))).asHours();

【讨论】:

【参考方案4】:

我知道这已经得到解答,但如果你想要一些递归和更通用的东西,而不是依赖时刻 fromNow,你可以使用我创建的这个函数。当然,您可以更改其逻辑以根据您的需要进行调整以支持年和秒。

var createdAt = moment('2019-05-13T14:23:00.607Z');
var expiresAt = moment('2019-05-14T14:23:00.563Z');

// You can also add years in the beginning of the array or seconds in its end
const UNITS = ["months", "weeks", "days", "hours", "minutes"]
function getValidFor (createdAt, expiresAt, unit = 'months') 
    const validForUnit = expiresAt.diff(createdAt, unit);
    // you could adjust the if to your needs 
    if (validForUnit > 1 || unit === "minutes") 
    return [validForUnit, unit];
  
  return getValidFor(createdAt, expiresAt, UNITS[UNITS.indexOf(unit) + 1]);

【讨论】:

【参考方案5】:

有一个很棒的moment 方法称为fromNow(),它会以人类可读的形式返回特定时间的时间,如下所示:

moment('2019-04-30T07:30:53.000Z').fromNow() // an hour ago || a day ago || 10 days ago

或者,如果您想在两个特定日期之间使用:

var a = moment([2007, 0, 28]);
var b = moment([2007, 0, 29]);
a.from(b); // "a day ago"

取自文档:

fromNow() from()

【讨论】:

这对我来说是最好的方法,因为我不需要自己计算小时/天/月/年前的字符串,而且它只是一行!谢谢!! 您还可以将布尔值传递给from/fromNow 以从中删除前缀。默认情况下,它将返回 in 5 minutes。使用布尔值 (a.from(b, true)) 你只会得到5 minutes【参考方案6】:

就我而言,我想要小时和分钟:

var duration = moment.duration(end.diff(startTime));
var hours = duration.hours(); //hours instead of asHours
var minutes = duration.minutes(); //minutes instead of asMinutes

更多信息请参考官方docs。

【讨论】:

【参考方案7】:

我知道这是旧的,但这里有一个单一的解决方案:

const hourDiff = start.diff(end, "hours");

startend 是矩对象。

享受吧!

【讨论】:

【参考方案8】:

如果您希望按天计算两个日期之间的总分钟数,那么下面的代码可能会对您有所帮助开始日期:2018-05-04 02:08:05结束日期: 2018-05-14 09:04:07...

function countDaysAndTimes(startDate,endDate)
return new Promise(function (resolve, reject) 
var dayObj = new Object;
var finalArray = new Array;

var datetime1 = moment(startDate);
var datetime2 = moment(endDate);
if(datetime1.format('D') != datetime2.format('D') || datetime1.format('M') != datetime2.format('M') ||  datetime1.format('YYYY') != datetime2.format('YYYY'))
  var onlyDate1 = startDate.split(" ");
  var onlyDate2 = endDate.split(" ");
  var totalDays = moment(onlyDate2[0]).diff(moment(onlyDate1[0]), 'days')

  // First Day Entry
  dayObj.startDate = startDate;
  dayObj.endDate = moment(onlyDate1[0]).add(1, 'day').format('YYYY-MM-DD')+" 00:00:00";
  dayObj.minutes = moment(dayObj.endDate).diff(moment(dayObj.startDate), 'minutes');
  finalArray.push(dayObj);

  // Between Days Entry
  var i = 1;
  if(totalDays > 1)
    for(i=1; i<totalDays; i++)
      var dayObj1 = new Object;
      dayObj1.startDate = moment(onlyDate1[0]).add(i, 'day').format('YYYY-MM-DD')+" 00:00:00";
      dayObj1.endDate = moment(onlyDate1[0]).add(i+1, 'day').format('YYYY-MM-DD')+" 00:00:00";
      dayObj1.minutes = moment(dayObj1.endDate).diff(moment(dayObj1.startDate), 'minutes');
      finalArray.push(dayObj1);
    
  

  // Last Day Entry
  var dayObj2 = new Object;
  dayObj2.startDate = moment(onlyDate1[0]).add(i, 'day').format('YYYY-MM-DD')+" 00:00:00";
  dayObj2.endDate = endDate ;
  dayObj2.minutes = moment(dayObj2.endDate).diff(moment(dayObj2.startDate), 'minutes');
  finalArray.push(dayObj2);


else
  dayObj.startDate = startDate;
  dayObj.endDate = endDate;
  dayObj.minutes = datetime2.diff(datetime1, 'minutes');
  finalArray.push(dayObj);

console.log(JSON.stringify(finalArray));
// console.table(finalArray);
resolve(finalArray);
);

输出

 [
  
  "startDate":"2018-05-04 02:08:05",
  "endDate":"2018-05-05 00:00:00",
  "minutes":1311
  ,
  
  "startDate":"2018-05-05 00:00:00",
  "endDate":"2018-05-06 00:00:00",
  "minutes":1440
  ,
  
  "startDate":"2018-05-06 00:00:00",
  "endDate":"2018-05-07 00:00:00",
  "minutes":1440
  ,
  
  "startDate":"2018-05-07 00:00:00",
  "endDate":"2018-05-08 00:00:00",
  "minutes":1440
  ,
  
  "startDate":"2018-05-08 00:00:00",
  "endDate":"2018-05-09 00:00:00",
  "minutes":1440
  ,
  
  "startDate":"2018-05-09 00:00:00",
  "endDate":"2018-05-10 00:00:00",
  "minutes":1440
  ,
  
  "startDate":"2018-05-10 00:00:00",
  "endDate":"2018-05-11 00:00:00",
  "minutes":1440
  ,
  
  "startDate":"2018-05-11 00:00:00",
  "endDate":"2018-05-12 00:00:00",
  "minutes":1440
  ,
  
  "startDate":"2018-05-12 00:00:00",
  "endDate":"2018-05-13 00:00:00",
  "minutes":1440
  ,
  
  "startDate":"2018-05-13 00:00:00",
  "endDate":"2018-05-14 00:00:00",
  "minutes":1440
  ,
  
  "startDate":"2018-05-14 00:00:00",
  "endDate":"2018-05-14 09:04:07",
  "minutes":544
  
 ]

【讨论】:

【参考方案9】:
 var start=moment(1541243900000);
 var end=moment(1541243942882);
 var duration = moment.duration(end.diff(startTime));
 var hours = duration.asHours();

如您所见,开始日期和结束日期必须是时刻对象才能使此方法起作用。

【讨论】:

虽然此代码可以回答问题,但提供有关 如何为什么 解决问题的附加上下文将提高​​答案的长期价值。 【参考方案10】:

您需要做的就是将hours 作为第二个参数传递给moments diff 函数。

var a = moment([21,30,00], "HH:mm:ss")
var b = moment([09,30,00], "HH:mm:ss")
a.diff(b, 'hours') // 12

文档: https://momentjs.com/docs/#/displaying/difference/

示例:

const dateFormat = "YYYY-MM-DD HH:mm:ss";
// Get your start and end date/times
const rightNow = moment().format(dateFormat);
const thisTimeYesterday = moment().subtract(1, 'days').format(dateFormat);
// pass in hours as the second parameter to the diff function
const differenceInHours = moment(rightNow).diff(thisTimeYesterday, 'hours');

console.log(`$differenceInHours hours have passed since this time yesterday`);
<script 
  src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js">
</script>

【讨论】:

【参考方案11】:
            var timecompare = 
            tstr: "",
            get: function (current_time, startTime, endTime) 
                this.tstr = "";
                var s = current_time.split(":"), t1 = tm1.split(":"), t2 = tm2.split(":"), t1s = Number(t1[0]), t1d = Number(t1[1]), t2s = Number(t2[0]), t2d = Number(t2[1]);

                if (t1s < t2s) 
                    this.t(t1s, t2s);
                

                if (t1s > t2s) 
                    this.t(t1s, 23);
                    this.t(0, t2s);
                

                var saat_dk = Number(s[1]);

                if (s[0] == tm1.substring(0, 2) && saat_dk >= t1d)
                    return true;
                if (s[0] == tm2.substring(0, 2) && saat_dk <= t2d)
                    return true;
                if (this.tstr.indexOf(s[0]) != 1 && this.tstr.indexOf(s[0]) != -1 && !(this.tstr.indexOf(s[0]) == this.tstr.length - 2))
                    return true;

                return false;

            ,
            t: function (ii, brk) 
                for (var i = 0; i <= 23; i++) 
                    if (i < ii)
                        continue;
                    var s = (i < 10) ? "0" + i : i + "";
                    this.tstr += "," + s;
                    if (brk == i)
                        break;
                
            ;

【讨论】:

你能补充一些解释而不是仅仅发布代码吗?【参考方案12】:
var __startTime = moment("2016-06-06T09:00").format();
var __endTime = moment("2016-06-06T21:00").format();

var __duration = moment.duration(moment(__endTime).diff(__startTime));
var __hours = __duration.asHours();
console.log(__hours);

【讨论】:

删除所有不必要的从/到时刻字符串表示的转换,您最终将得到可接受的答案。 为什么变量名的开头有多余的下划线?【参考方案13】:

以下代码块展示了如何使用 MomentJS 计算两个日期之间的天数差。

var now = moment(new Date()); //todays date
var end = moment("2015-12-1"); // another date
var duration = moment.duration(now.diff(end));
var days = duration.asDays();
console.log(days)

【讨论】:

至少他的代码块显示了与接受的答案或问题不同的所有正在使用的变量。如果有人想对他们投反对票,应该对问题投反对票,因为它是一个不完整的代码块。那个代码块真的需要解释吗? 这个答案对我来说很清楚,甚至比上面接受的答案更完整,你不知道'end'和'startTime'来自哪里......非常感谢你的回答Raj ! 现在通过var now = moment(); 获取要简单一些。见momentjs.com/docs/#/parsing/now【参考方案14】:

或者你可以简单地做:

var a = moment('2016-06-06T21:03:55');//now
var b = moment('2016-05-06T20:03:55');

console.log(a.diff(b, 'minutes')) // 44700
console.log(a.diff(b, 'hours')) // 745
console.log(a.diff(b, 'days')) // 31
console.log(a.diff(b, 'weeks')) // 4

文档:here

【讨论】:

如何同时显示所有小时、分钟和秒?喜欢 HH:MM:SS 吗? @FaizanSaiyed,我知道已经很晚了,但是,这是怎么做的 - var a = moment('2016-06-06T22:34:56'); var b = moment('2016-06-06T21:03:55'); var diff_s = a.diff(b, 'seconds'); console.log(moment.utc(moment.duration(diff_s, "seconds").asMilliseconds()).format("hh:mm:ss")) @FaizanSaiyed,感谢您提供正确的解决方案。【参考方案15】:

你很亲密。您只需要使用duration.asHours() 方法(请参阅the docs)。

var duration = moment.duration(end.diff(startTime));
var hours = duration.asHours();

【讨论】:

不应该是startTime.diff(end, 'hours', true);吗?持续时间.asHours();如果是 25 小时前,将返回 1。 @DanielF 如果你使用 MomentJS >= version 2.0.0,你可以使用.diff(),是的。除了 end.diff(startTime, 'hours', true) 将小时数作为正数。但是,您的第二点是不正确的。 duration.hours() 会在 25 小时前返回 1,但 duration.asHours() 会返回 25。 @GregL 我已更正jsfiddle.net/qxxr1Lyr 我一定是在没有注意到的情况下错误地使用了.hours() 方法。 @zanderwar 我理解你的沮丧,但这是一个 5 年前的问题。今天这样的问题和答案不会飞。 @integrater 您的代码中的 end 是 Moment 实例吗?尝试用moment() 包装它以进行转换。 .diff() 是 MomentJS 方法,仅适用于 Moment 对象,不适用于本机 JS Date 对象。

以上是关于在 Moment Js 中获取两个日期之间的小时差的主要内容,如果未能解决你的问题,请参考以下文章

如何获得两个日期对象之间的小时差? [复制]

如何在bigquery中获得浮动或十进制的两个日期时间之间的小时差

两个日期融合交通情报(分析)之间的时差

Moment.js:日期之间的日期

如何获取两个日期时间字段的轨道分钟时差?

Moment.js 从日期获取日期名称