【问题标题】:Moment.js - Get difference in two birthdays in years, months and daysMoment.js - 在年、月和日中获得两个生日的差异
【发布时间】:2021-10-29 18:41:17
【问题描述】:

我正在寻找一种方法来使用 momentjs 来解析两个日期,以显示差异。

我希望它采用以下格式:“X 年,Y 月,Z 天”。

Moment 库和模运算符多年来一直运行良好。但是对于那些日子来说,这是另一个故事,因为我不想自己处理闰年和所有这些。到目前为止,我脑子里的逻辑是这样的:

var a = moment([2015, 11, 29]);
var b = moment([2007, 06, 27]);

var years = a.diff(b, 'years');
var months = a.diff(b, 'months') % 12;
var days = a.diff(b, 'days');
// Abit stuck here as leap years, and difference in number of days in months. 
// And a.diff(b, 'days') returns total number of days.
return years + '' + months + '' + days;

【问题讨论】:

    标签: javascript date momentjs


    【解决方案1】:

    您可以得到年份的差异并将其添加到初始日期;然后得到月份的差异,然后再次将其添加到初始日期。

    这样做,您现在可以轻松获得天数的差异,同时避免使用模运算符。

    Example Here

    var a = moment([2015, 11, 29]);
    var b = moment([2007, 06, 27]);
    
    var years = a.diff(b, 'year');
    b.add(years, 'years');
    
    var months = a.diff(b, 'months');
    b.add(months, 'months');
    
    var days = a.diff(b, 'days');
    
    console.log(years + ' years ' + months + ' months ' + days + ' days');
    // 8 years 5 months 2 days
    

    我不知道有更好的内置方法来实现这一点,但这种方法似乎效果很好。

    【讨论】:

    • 谢谢!这正是我想要的:)
    • 应该在 2 月 29 日加上一年返回 2 月 28 日还是 3 月 1 日? 5 月 31 日加一个月应该是 6 月 30 日还是 7 月 1 日?
    • 这个答案给出了正确的年、月、日b = moment([2007, 11, 29])。 (8 年 0 个月 0 天)而@Kunal 的回答给出了(8 年 0 个月 1 天)
    • 这不是为需要日历月的人返回正确答案。 var a = moment([2020, 03, 01]); var b = moment([2020, 01, 31]);返回 "0 年 0 个月 30 天" 但实际上应该是 1 个月和 2 天
    【解决方案2】:

    Moment.js 也有 duration 对象。片刻被定义为单个时间点,而持续时间被定义为基本上是您想要的时间长度。

    var a = moment([2015, 11, 29]);
    var b = moment([2007, 06, 27]);
    
    var diffDuration = moment.duration(a.diff(b));
    
    console.log(diffDuration.years()); // 8 years
    console.log(diffDuration.months()); // 5 months
    console.log(diffDuration.days()); // 2 days
    

    @Josh 的建议可能有效,但绝对不是计算 2 时刻差异的正确方法。

    【讨论】:

    • 01/01/201301/01/2016 之间的区别的错误答案。它给出了2y 11m 29d,而乔希的答案给出了3y
    【解决方案3】:

    我刚刚将@Josh Crozier's answer 转换为一个函数并添加了小时分钟

     function diffYMDHMS(date1, date2) {
    
        let years = date1.diff(date2, 'year');
        date2.add(years, 'years');
    
        let months = date1.diff(date2, 'months');
        date2.add(months, 'months');
    
        let days = date1.diff(date2, 'days');
        date2.add(days, 'days');
    
        let hours = date1.diff(date2, 'hours');
        date2.add(hours, 'hours');
    
        let minutes = date1.diff(date2, 'minutes');
        date2.add(minutes, 'minutes');
    
        let seconds = date1.diff(date2, 'seconds');
    
        console.log(years + ' years ' + months + ' months ' + days + ' days ' + hours + ' 
        hours ' + minutes + ' minutes ' + seconds + ' seconds'); 
    
        return { years, months, days, hours, minutes, seconds};
    }
    

    【讨论】:

      【解决方案4】:

      上述解决方案不适用于 momentjs 2.19.1

      然后参考Date of Joining calculation not working with moment 2.19.1,我使用momentjs 2.19.1 的最新解决方案实施了新解决方案。

      必需的 npm 包

      "moment": "^2.19.4",

      "moment-duration-format": "^1.3.0",

      "react-moment": "^0.6.8",

      在 reactjs 中导入以下内容

       import moment from "moment";
       import Moment from "react-moment";
       import momentDurationFormatSetup from "moment-duration-format";
      

      var DOJ = moment([work_data.joining_date]).format("YYYY,MM,DD");      
      var today = moment().format("YYYY,MM,DD");      
      var totalMonths =  parseInt(moment(today).diff(moment(DOJ), 'months'));      
      var totalDuration = moment.duration(totalMonths, "months").format();      
      if(totalDuration.search('1y') > -1) {
         totalDuration = totalDuration.replace("1y", "1 Year,");
      } else {
         totalDuration = totalDuration.replace("y", " Years,");
      }
      
      if(totalDuration.search('1m') > -1){
        totalDuration = totalDuration.replace("1m", "1 Month");
      } else {
        totalDuration = totalDuration.replace("m", " Months");
      }
      
      console.log(totalDuration);
      

      【讨论】:

        【解决方案5】:

        这里介绍的所有解决方案对于某些测试用例都失败了。所以我对接受的答案做了一些修改。

        function getYMD(date1, date2) {
            const a = moment(date1);
            const b = moment(date2);
            var years = a.diff(b, 'year');
            b.add(years, 'years');
        
            const noOfDaysInb = b.daysInMonth();
            const noOfDaysIna = a.daysInMonth();
            let months = 0;
            if (noOfDaysInb > noOfDaysIna) {
                months = b.diff(a, "months");
                a.add(months, "months");
            } else {
                months = a.diff(b, 'months');
                b.add(months, 'months');
            }
            var days = a.diff(b, 'days');
            return {
                years: Math.abs(years),
                months: Math.abs(months),
                days: Math.abs(days),
            }
        }
        

        这是我能想到的最佳答案。

        【讨论】:

          【解决方案6】:

          这是另一个答案。使用年龄计算器验证

          function calculateAge(){
              ageText = jQuery("#dob").closest(".form-group").find(".age-text");
              ageText.text("");
              level2.dob = jQuery("#dob").val();
              if(!level2.dob) return;
              level2.mdob= moment(level2.dob, 'DD-MM-YYYY');
              if(!level2.mdob.isValid()){
                  alert("Invalid date format");
                  return;
              }
              level2.targetDate = moment();//TODO: Fill in the target date
              level2.months = level2.targetDate.diff(level2.mdob, 'months'); // Calculate the months
              let years = parseInt(level2.months/12); // A year has 12 months irrespective or leap year or not
              let balanceMonths = level2.months%12; // The balance gives the number of months 
              let days;
              if(!balanceMonths){ // If no balance months, then the date selected lies in the same month
                  months = 0; // so months = 0
                  days = level2.targetDate.diff(level2.mdob, 'days'); // only the days difference
              }else{
              months = balanceMonths;
              dob_date = level2.mdob.date();
              target_month = level2.targetDate.month();
              construct_date = moment().month(target_month).date(dob_date);
              days = level2.targetDate.diff(construct_date, 'days')+1; // There might be one day missed out. Not sure on UTC
          }
          
          ageText = years +" years " + months+ " months " + days +" days";
          }
          

          【讨论】:

            【解决方案7】:

            使用这个

              var totalDays = endDate.diff(startDate, "days");
            

            【讨论】:

            • 这只给出了整个天数。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-10-02
            • 2014-04-07
            • 2013-07-23
            • 2013-07-17
            相关资源
            最近更新 更多