【问题标题】:JavaScript calculate years and days from start dateJavaScript 从开始日期计算年数和天数
【发布时间】:2017-01-31 12:42:56
【问题描述】:

我有一个人的出生日期,我需要用JavaScript或jQuery左右计算,从出生日期到现在有多少年,多少天。

所以结果可能是 20 年 89 天。

我需要与维基百科的“年龄”功能相同的结果,因为它需要考虑闰年而不是什么。到目前为止,我得到了有效的代码,但在某些情况下会犯 1 天的错误。我的功能是:

function DateDiff(date1, date2){
var res=((date1.getTime() - date2.getTime())/1000/60/60/24)-offset_d;
var full_days=Math.floor(res/365.25);
var f1=Math.round((res%365.25))
return  full_days + " years, " +f1 +  " days" ; }

感谢您的帮助,我已经这样做了好几天了。

【问题讨论】:

  • 请各位大神帮忙,我无法计算从某个日期到现在有多少年和多少天。
  • 365.24 更准确,物有所值。
  • 谢谢,但我刚刚使用 moment.js 获得了完整的工作代码,现在的问题是它显示每个用户时区,而不是通用结果。如何强制 moment.js 忽略时区?谢谢!

标签: javascript date leap-year


【解决方案1】:

我不久前写了以下内容,您应该可以对其进行调整以完成这项工作:

// Given a date object, calcualte the number of
// days in the month
function daysInMonth(x) {
  var d = new Date(x);
  d.setDate(1);
  d.setMonth(d.getMonth() + 1);
  d.setDate(0);
  return d.getDate();
}

/* For person born on birthDate, return their 
** age on datumDate.
**
** Don't modify original date objects
**
** tDate is used as adding and subtracting
** years, months and days from dates on 29 February 
** can affect the outcome, 
**
** e.g.
**
** 2000-02-29 + 1 year => 2001-03-01
** 2001-03-01 - 1 year => 2000-03-01 so not symetric
**
** Note: in some systems, a person born on 29-Feb
** will have an official birthday on 28-Feb, other 
** systems will have official birthday on 01-Mar.
*/
function getAge(birthDate, datumDate) {

  // Make sure birthDate is before datumDate
  if (birthDate - datumDate > 0) return null;

  var dob = new Date(+birthDate),
      now = new Date(+datumDate),
      tDate = new Date(+dob),
      dobY = dob.getFullYear(),
      nowY = now.getFullYear(),
      years, months, days;

  // Initial estimate of years
  years = nowY - dobY;
  dobY = (dobY + years);
  tDate.setYear(dobY);

  // Correct if too many
  if (now < tDate) {
    --years;
    --dobY;
  }
  dob.setYear(dobY);
  
  // Repair tDate
  tDate = new Date(+dob);

  // Initial month estimate
  months = now.getMonth() - tDate.getMonth();

  // Adjust if needed
  if (months < 0) {
    months = 12 + months;

  } else if (months == 0 && tDate.getDate() > now.getDate()) {
    months = 11;
  }
  tDate.setMonth(tDate.getMonth() + months);

  if (now < tDate) {
    --months;
    dob.setMonth(tDate.getMonth() - 1); 
  }

  // Repair tDate
  tDate = new Date(+dob);

  // Initial day estimate
  days = now.getDate() - tDate.getDate();

  // Adjust if needed 
  if (days < 0) {
    days = days + daysInMonth(tDate);
  }
  dob.setDate(dob.getDate() + days);

  if (now < dob) {
    --days;
  }

  return years + 'y ' + months + 'm ' + days + 'd';
}


function parseDMY(s) {
  var b = s.split(/\D/);
  var d = new Date(b[2], --b[1], b[0]);
  return d && d.getMonth() == b[1]? d : new Date(NaN); 
}

window.onload = function() {
  var form = document.forms['ageCalc'];
  form.onsubmit = function() {
    var dob = parseDMY(form.dob.value);
    form.age.value = isNaN(dob)? 'Invalid date' : getAge(dob, new Date());
    return false;
  }
}
<form id="ageCalc">
<table>
  <tr>
    <td>Date of Birth (d/m/y)
    <td><input name="dob">
  <tr>
    <td>Age today (y, m, d)
    <td><input readonly name="age">
  <tr>
    <td><input type="reset">
    <td><input type="submit" value="Calculate Age">
</table>
</form>

这是一个直接的年份和日期版本:

function diffInYearsAndDays(startDate, endDate) {

  // Copy and normalise dates
  var d0 = new Date(startDate);
  d0.setHours(12,0,0,0);
  var d1 = new Date(endDate);
  d1.setHours(12,0,0,0);

  // Make d0 earlier date
  // Can remember a sign here to make -ve if swapped
  if (d0 > d1) {
    var t = d0;
    d0 = d1;
    d1 = t;
  }  

  // Initial estimate of years
  var dY = d1.getFullYear() - d0.getFullYear();

  // Modify start date
  d0.setYear(d0.getFullYear() + dY);

  // Adjust if required
  if (d0 > d1) {
    d0.setYear(d0.getFullYear() - 1);
    --dY;
  }

  // Get remaining difference in days
  var dD = (d1 - d0) / 8.64e7;

  // If sign required, deal with it here
  return [dY, dD];  
}

alert(diffInYearsAndDays(new Date(1957, 11, 4), new Date(2012, 11, 2))); // [54, 364]

【讨论】:

  • 谢谢,但我刚刚使用 moment.js 获得了完整的工作代码,现在的问题是它显示每个用户时区,而不是通用结果。如何强制 moment.js 忽略时区?谢谢!
  • 我不知道,我不使用moment.js。 Javascript 日期对象在内部将时间值存储为 UTC 纪元的毫秒时间,因此它们本质上是 UTC。如果您将 setHours 替换为 setUTCHours 并将 setYear 替换为 setUTCFullYear,则上述将给出 UTC 结果。
【解决方案2】:

你可以自己动手……但我强烈推荐Moment.js之类的东西。它是一个可靠的库,已在该领域证明可以像这样计算数学。它只有 4k,所以我认为你的尺寸也可以。

【讨论】:

  • aaronfrost 我检查了 Moment.js,我没有反对任何基于 JS 的解决方案,因为我真的无法单独解决这个问题。var a = moment([2012, 1, 29]); var b = moment([2007, 12, 31]);警报(a.diff(b,“年”));我怎么能得到日子?
【解决方案3】:

最终解决方案与任何库无关,而是与逻辑相关。我将开始年龄小时和分钟设置为与当天的小时和分钟相同。然后我继续增加 12 个月,直到一年结束。那是为了计算整年。然后,我将不超过当前日期的最后一个“生日”设置为信息,以获取并使用与该日期和当前日期相比的标准日期差异。

它起到了魅力。

感谢大家的大力帮助。它帮助我专注于主题。

【讨论】:

    猜你喜欢
    • 2016-01-11
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 2021-10-11
    • 2019-02-05
    • 1970-01-01
    相关资源
    最近更新 更多