【问题标题】:Get the time difference between two datetimes获取两个日期时间之间的时间差
【发布时间】:2013-09-08 13:08:21
【问题描述】:

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

【问题讨论】:

标签: javascript date time momentjs difference


【解决方案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(),但您还必须对它们进行零填充。

这是必要的,因为格式化 duration 反对的能力目前不在 moment.js 中。 It has been requested here。但是,有一个名为 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 小时的时间,但如果发生这种情况,我很高兴能够选择。感谢您的帮助。
  • 在找到这个答案之前浪费了将近 15 分钟,感谢您提到“这种方法仅在总持续时间少于 24 小时时才有效”
  • 这个c#怎么写?
  • @EduardoHerrera - Moment 是一个 JavaScript 库。如果您对 C# 中的类似内容有疑问,请ask a new question - 不要链接到 cmets。谢谢。
【解决方案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 而不是hours,并去掉小数点。否则它会遇到你在我的回答中遇到的同样的问题。 :)
  • humanize() 给人一种很好的感觉,但我最终还是使用了 Matt 的建议。感谢您的提示。
  • 感谢您指出这一点,@MattJohnson - 我什至没有意识到 .asHours 和 .hours 是不同的,以为一个只是另一个的较短名称,但仔细检查后,你是正确。
  • 注意,最好使用:[Math.floor(diff.asHours()), diff.minutes(), diff.seconds()].join(':') 以获得所需的结果。第一部分没有小数
【解决方案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想要时差
  • 这是最简单的解决方案。是的,还有时间戳。
【解决方案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;
        }
        

        【讨论】:

        • 我在你回答的任何地方都看不到时刻使用情况。
        【解决方案8】:

        使用这个,

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

        【讨论】:

          【解决方案9】:

          代替

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

          这样做更好

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

          【讨论】:

            【解决方案10】:

            这适用于 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());
            

            【讨论】:

              【解决方案11】:

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

              【讨论】:

                【解决方案12】:

                Typescript:以下应该可以工作,

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

                【讨论】:

                  【解决方案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)
                    

                    用于生成javascripthttps://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 的时代时差

                        获取两个纪元时间之间的差异:

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

                              【讨论】:

                                【解决方案20】:

                                时刻非常简单 下面的代码将返回与当前时间的小时差异:

                                moment().diff('2021-02-17T14:03:55.811000Z', "h")
                                

                                【讨论】:

                                  【解决方案21】:

                                  这将返回最大的时间段差异,例如(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}
                                  

                                  【讨论】:

                                    猜你喜欢
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2019-06-22
                                    • 2012-03-24
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多