0

私は誰かが生まれた日付を持っていて、生年月日から何年、何日、今までを 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" ; }

助けてくれてありがとう、私はこれを何日もやっています。

4

3 に答える 3

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]
于 2012-07-20T00:55:54.137 に答える
0

独自のロールを作成することもできますが、Moment.jsのようなものを強くお勧めします。このようにMathを計算する分野で実績のある確かなライブラリです。4kしかないのでサイズ的にも大丈夫だと思います。

于 2012-07-19T22:31:51.757 に答える
-1

結局のところ、解決策はいかなる自由にも関係していませんでしたが、論理に関係していました。開始年齢の時間と分を現在の日の時間と分と同じに設定しました。それから私は年が現在を超えるまで12ヶ月を追加し続けます。それは通年を数えるためでした。次に、現在の日付を超えていない最後の「誕生日」を情報として設定し、その日付と現在の日付に対する日数の標準的な日付の差を使用します。

それは魅力として働いた。

皆様のご協力に感謝いたします。それは私がトピックに集中するのを助けました。

于 2012-07-23T01:52:34.843 に答える