如何计算两个日期之间的年数?

IT技术 javascript datetime
2021-02-07 15:24:33

我想获得两个日期之间的年数。我可以得到这两天之间的天数,但是如果我将它除以 365,结果是不正确的,因为有些年份有 366 天。

这是我获取日期差异的代码:

var birthday = value;//format 01/02/1900
var dateParts = birthday.split("/");

var checkindate = new Date(dateParts[2], dateParts[0] - 1, dateParts[1]);   
var now = new Date();
var difference = now - checkindate;
var days = difference / (1000*60*60*24);

var thisyear = new Date().getFullYear();
var birthyear = dateParts[2];

    var number_of_long_years = 0;
for(var y=birthyear; y <= thisyear; y++){   

    if( (y % 4 == 0 && y % 100 == 0) || y % 400 == 0 ) {

                    number_of_long_years++;             
    }
}   

天数工作完美。我试图在一年 366 天的时候添加额外的天数,我正在做这样的事情:

var years = ((days)*(thisyear-birthyear))
            /((number_of_long_years*366) + ((thisyear-birthyear-number_of_long_years)*365) );

我正在计算年份。这是正确的,还是有更好的方法来做到这一点?

6个回答

圆滑的基础 javascript 功能。

 function calculateAge(birthday) { // birthday is a date
   var ageDifMs = Date.now() - birthday;
   var ageDate = new Date(ageDifMs); // miliseconds from epoch
   return Math.abs(ageDate.getUTCFullYear() - 1970);
 }
这不一定是错误的,因为一年后的同一天不是一整年——只有生日日期的时间是 00:00:00,而当前日期时间是同一天的 24:00:00 - 即次日00:00:00 因此,您可能希望在继续之前向 ageDate 添加一天。setHours(0,0,0,0)仍然在生日那天,因为如果它 > 0 并且涉及一些疯狂的 DST / 闰年 / 时区更改,我预计会有麻烦。或者setHours(24, 0, 0, 0)在生日那天?最好彻底测试一下。
2021-03-13 15:24:33
我尝试了您的解决方案,但是当我使用一年前同一天的生日时,它说年龄是 0,而应该是 1。
2021-03-14 15:24:33
这会偶尔出现闰年问题,因为它实际上假设每个人都出生于 1970 年 1 月 1 日。
2021-04-09 15:24:33

可能不是您正在寻找的答案,但在 2.6kb 时,我不会尝试重新发明轮子,我会使用诸如moment.js 之类的东西没有任何依赖关系。

diff方法可能是您想要的:http : //momentjs.com/docs/#/displaying/difference/

使用纯javascript Date(),我们可以计算如下年数

document.getElementById('getYearsBtn').addEventListener('click', function () {
  var enteredDate = document.getElementById('sampleDate').value;
  // Below one is the single line logic to calculate the no. of years...
  var years = new Date(new Date() - new Date(enteredDate)).getFullYear() - 1970;
  console.log(years);
});
<input type="text" id="sampleDate" value="1980/01/01">
<div>Format: yyyy-mm-dd or yyyy/mm/dd</div><br>
<button id="getYearsBtn">Calculate Years</button>

它大部分时间都在工作,但看起来如果有人出生在 2005/10/26 或 2004/10/26,当计算机日期设置为 2019/10/26 时,函数会返回这两个时间 14。有谁知道为什么?
2021-03-21 15:24:33

没有 for-each 循环,不需要额外的 jQuery 插件......只需调用下面的函数......从两个日期之间的年数差异中得到

        function dateDiffInYears(dateold, datenew) {
            var ynew = datenew.getFullYear();
            var mnew = datenew.getMonth();
            var dnew = datenew.getDate();
            var yold = dateold.getFullYear();
            var mold = dateold.getMonth();
            var dold = dateold.getDate();
            var diff = ynew - yold;
            if (mold > mnew) diff--;
            else {
                if (mold == mnew) {
                    if (dold > dnew) diff--;
                }
            }
            return diff;
        }

我使用以下计算年龄。

我命名它gregorianAge()是因为这个计算给出了我们如何使用公历来表示年龄。即如果月份和日期在出生年份的月份和日期之前,则不计算结束年份。

/**
 * Calculates human age in years given a birth day. Optionally ageAtDate
 * can be provided to calculate age at a specific date
 *
 * @param string|Date Object birthDate
 * @param string|Date Object ageAtDate optional
 * @returns integer Age between birthday and a given date or today
 */
gregorianAge = function(birthDate, ageAtDate) {
  // convert birthDate to date object if already not
  if (Object.prototype.toString.call(birthDate) !== '[object Date]')
    birthDate = new Date(birthDate);

  // use today's date if ageAtDate is not provided
  if (typeof ageAtDate == "undefined")
    ageAtDate = new Date();

  // convert ageAtDate to date object if already not
  else if (Object.prototype.toString.call(ageAtDate) !== '[object Date]')
    ageAtDate = new Date(ageAtDate);

  // if conversion to date object fails return null
  if (ageAtDate == null || birthDate == null)
    return null;


  var _m = ageAtDate.getMonth() - birthDate.getMonth();

  // answer: ageAt year minus birth year less one (1) if month and day of
  // ageAt year is before month and day of birth year
  return (ageAtDate.getFullYear()) - birthDate.getFullYear()
    - ((_m < 0 || (_m === 0 && ageAtDate.getDate() < birthDate.getDate()))?1:0)
}
<input type="text" id="birthDate" value="12 February 1982">
<div style="font-size: small; color: grey">Enter a date in an acceptable format e.g. 10 Dec 2001</div><br>
<button onClick='js:alert(gregorianAge(document.getElementById("birthDate").value))'>What's my age?</button>