计算两个日期之间的周年纪念日数?

时间:2021-02-09 00:26:30

标签: javascript algorithm

在 Javascript 中计算两个日期之间的周年纪念日数的最简单方法是什么。

我的尝试:

module.exports.countAnniversariesBetweenTwoDates = (start_date, end_date, anniversary_date) => {

  if (start_date == end_date) {
    return 0;
  }

  let start_date_year = start_date.getFullYear();
  let end_date_year = end_date.getFullYear();
  let anniversary_year = anniversary_date.getFullYear();
  let start_date_month_and_day = Number(('0' + (start_date.getMonth() + 1)).slice(-2) + '' + ('0' + start_date.getDate()).slice(-2));
  let end_date_month_and_day = Number(('0' + (end_date.getMonth() + 1)).slice(-2) + '' + ('0' + end_date.getDate()).slice(-2));
  let anniversary_date_month_and_day = Number(('0' + (anniversary_date.getMonth() + 1)).slice(-2) + '' + ('0' + anniversary_date.getDate()).slice(-2));

  let anniversary_count = 0;

  // special case for start year
  if (start_date_month_and_day < anniversary_date_month_and_day) {
    anniversary_count++;
  }

  let temp_start_date_year = start_date_year + 1;
  while(temp_start_date_year < end_date_year) {
    anniversary_count++;
    temp_start_date_year++;
  }

  // special case for end year
  if (end_date_month_and_day > anniversary_date_month_and_day) {
    anniversary_count++;
  }
  return anniversary_count;
}

2 个答案:

答案 0 :(得分:1)

如果您使用 moment.js,您可以将两个日期之间的差异作为年数,使用 Math.floor() 向下舍入到最接近的完整年数:

yearDiff = Math.floor(moment(new Date(endDate)).diff(new Date(startDate),'years'));

编辑:上面的代码可以稍微简化一点:

yearDiff = moment(endDate).diff(startDate,'years');

您可能需要编写一些额外的代码来处理少于一年的时间段或其他一些特殊情况。

您当然可以按照与您的操作方式类似的方式遍历日期:

var startDate = "03/08/2019";
var endDate = "01/01/2022";
var anniversary = "03/07/2015";
var anniversaryCount = 0;

var counterMoment = moment(startDate);
while (counterMoment.isSameOrBefore(endDate)) {
    var anniversaryThisYear = moment(anniversary).year(counterMoment.year());
    if (counterMoment.isSame(anniversaryThisYear)) {
        anniversaryCount++;
    }
    counterMoment.add(1,'day');
}
alert("Number of anniversaries: "+anniversaryCount);

这完全取决于最终结果是什么以及您打算如何使用价值。

答案 1 :(得分:1)

以下是闰年:

function validDate(year, month, day) {
  var testDate = new Date(year, month, day);
  return testDate.getFullYear() === year && testDate.getMonth() === month && testDate.getDate() === day;
}

function countAnniversaries(begin, end, anniversary) {
  var countDate = new Date(anniversary.getTime());
  var anniversaries = 0;
  var countYear = begin.getFullYear();
  var anniversaryMonth = anniversary.getMonth();
  var anniversaryDay = anniversary.getDate();
  countDate.setFullYear(countYear);
  while (countDate.getTime() <= end.getTime()) {
    if (validDate(countYear, anniversaryMonth, anniversaryDay) && countDate.getTime() >= begin.getTime()) {
      anniversaries++;
    }
    countYear++;
    countDate.setFullYear(countYear);  
    countDate.setMonth(anniversaryMonth);
    countDate.setDate(anniversaryDay);
  }
  return anniversaries;
}

console.log(countAnniversaries(new Date('Feb 1, 2012'), new Date('Feb 4, 2026'), new Date('Feb 2, 2012')))
console.log(countAnniversaries(new Date('Feb 1, 2012'), new Date('Feb 4, 2026'), new Date('Feb 29, 2012')))