YYYYMMDDの形式で生年月日を指定して年齢を計算します


285

YYYYMMDD形式の誕生日を指定して、年齢を年単位で計算するにはどうすればよいですか?Date()関数を使用して可能ですか?

現在使用しているソリューションよりも優れたソリューションを探しています。

var dob = '19800810';
var year = Number(dob.substr(0, 4));
var month = Number(dob.substr(4, 2)) - 1;
var day = Number(dob.substr(6, 2));
var today = new Date();
var age = today.getFullYear() - year;
if (today.getMonth() < month || (today.getMonth() == month && today.getDate() < day)) {
  age--;
}
alert(age);


フォーマットを気にしてください、あなたがしたようにしてはいけません。コード(010101)ボタンまたはCtrl-Kを使用して、コードを4つのスペースでインデントします。
Marcel Korpel、

私はそうしましたが、IE9ベータでは動作しなかったので、手動で行う必要がありました。
Francisc

4
あなたの元の解決策は、現在の答えよりも、年齢の計算において優れています。ジュリオ・サントスの答えは本質的に同じです。他の答えは、多くの条件下で不正確な結果をもたらし、簡単ではないか、効率が低下する可能性があります。
Brock Adams、

ブロックさん、ありがとうございます。これを行うには、少し粗雑に見える方法よりもエレガントな方法があることを願っていました。
Francisc

4
@Francisc、それは粗雑ですが、それがDateカプセル化した場合、オブジェクトがしなければならないことです。人々はJSのDate扱いの面倒さについて本を書くことができました。...一日で時々休むことで暮らすことができるなら、概算AgeInYears = Math.floor ( (now_Date - DOB_Date) / 31556952000 )はあなたが得ることができるのと同じくらい簡単です。
Brock Adams、

回答:


245

私は読みやすさのために行きます:

function _calculateAge(birthday) { // birthday is a date
    var ageDifMs = Date.now() - birthday.getTime();
    var ageDate = new Date(ageDifMs); // miliseconds from epoch
    return Math.abs(ageDate.getUTCFullYear() - 1970);
}

免責事項:これにも精度の問題があるため、完全に信頼することもできません。数時間、数年、または夏時間(タイムゾーンによって異なります)までにオフになることがあります。

代わりに、精度が非常に重要な場合は、これにライブラリを使用することをお勧めします。また@Naveens post、時刻に依存しないため、おそらく最も正確です。


ベンチマーク:http : //jsperf.com/birthday-calculation/15


3
それはおそらく1返す必要があります2001-02-28に2000年2月29日などの日付のこのリターン0年
RobG

16
@RobG 2000-02-29から2001-02-28に技術的に1年が経過したとは思えないため、回答が無効になっています。2000-02-28から2001-02-28は年なので、2000-02-29から2001-02-28は1年未満でなければなりません。
アンドレ・Snedeコック

3
「正確ではない」の意味について詳しく説明していませんが、追加情報が役立つと思いました。問題を修正するか、回答を削除することを検討してください。
RobG 2014年

1
@RobG実際にやった。また、自分よりも優れたソリューションを指摘しました。私の解決策は、問題を読みやすい方法で、小さな精度の問題で解決しますが、その目的の範囲内です。
アンドレ・Snedeコック

1
@AndréSnedeHansenの素敵な答えも高速です。私の答えにあるようなクレイジーな分割がないため、読みやすさと速度のために+1します。
クリストファードルフ2014

506

これを試して。

function getAge(dateString) {
    var today = new Date();
    var birthDate = new Date(dateString);
    var age = today.getFullYear() - birthDate.getFullYear();
    var m = today.getMonth() - birthDate.getMonth();
    if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
        age--;
    }
    return age;
}

あなたのコードで粗雑に見えた唯一のものは substr部分部分。

フィドルhttp : //jsfiddle.net/codeandcloud/n33RJ/


使用例を教えてください。getAge(y、m、d)のような3つの個別の引数をとるように関数を変更しないと機能しません。例:jsbin.com/ehaqiw/1/edit
edt

他の多くの人と同様に、これは2000-02-29から2001-02-28はゼロ年であると考えています。
RobG 2014年

3
@RobG:跳躍が「祝う」とき(その質問に対する一般的な答えは、実際には「実際の日付に最も近い週末」のように思われるだけです)、誕生日は、以下を含むコンテキストに基づいて異なります:地理的な地域(簡単な英語:住んでいる場所) )、LAW(過小評価しないでください)、宗教、および個人的な好み(グループ行動を含む):ある理由:「2月に生まれた」、他の理由:「2月28日の翌日に生まれた」 (最も一般的に月の1回目である)en.wikipedia.org/wiki/February_29すべてこのアルゴ上記の場合は、正しいIF月の1回目は1人のニーズleapyear結果です
GitaarLAB

3
@RobG: 'plus x month'の余計な部分は、年数という人間の概念とは無関係です。一般的な人間の考えでは、カレンダーの月数と日数が(開始日と比較して)同じ場合、age(InYears)-counterは毎日(時間に関係なく)増加します。つまり、2000-02-28から2001-02 -27 = 0年、2000-02-28から2001-02-28 = 1年。leaplingsにその「常識」を拡張:2000年2月29日(日後の 2000年2月28日)2001年2月28日=にゼロ年。私のコメントは、回答されたアルゴが跳躍のためのこの論理に期待/同意する場合、常に「正しい」人間の回答を与えると述べただけです。
GitaarLAB 2016年

3
@RobG:私が言ったことがないか、答えは普遍的に正しかった(TM)。コンテキスト/管轄区域/ビューの概念を含めました。私の両方のコメントには、明らかに大文字のIFが含まれています(例外の跳躍の処理に向けて)。実際、私の最初のコメントは、私が言うつもりのことを正確に述べたものであり、正誤に関するいかなる判断も含みませんでした。実際、私のコメントでは、この回答から何を期待し、何を期待しないのか(およびその理由)を明確にします(「問題を強調する」ので)。追伸:2月31日?!?
GitaarLAB 2016年

72

重要:この回答は100%正確な回答を提供するものではなく、日付にもよりますが、約10〜20時間ずれています。

より良い解決策はありません(とにかくこれらの答えにはありません)。-ナヴィーン

もちろん、私は現在受け入れられている解決策よりも、挑戦に立ち向かい、速くて短い誕生日計算機を作るという衝動に抵抗することはできませんでした。私のソリューションの主なポイントは、数学が高速であるため、分岐を使用する代わりに、日付モデルのjavascriptが提供するソリューションを計算して、素晴らしい数学を使用することです

答えは次のようになり、naveenのプラスよりも最大65%速く実行されます。

function calcAge(dateString) {
  var birthday = +new Date(dateString);
  return ~~((Date.now() - birthday) / (31557600000));
}

マジックナンバー:31557600000は24 * 3600 * 365.25 * 1000です。これは1年の長さです。1年の長さは365日、6時間は0.25日です。最後に、最終年齢を与える結果をフロアーします。

ベンチマークは次のとおりです。 。http //jsperf.com/birthday-calculation

OPのデータ形式をサポートするために置き換えることができます +new Date(dateString);
との+new Date(d.substr(0, 4), d.substr(4, 2)-1, d.substr(6, 2));

あなたがより良い解決策を思い付くことができるならば、共有してください!:-)


それはかなりクールなソリューションです。私が見た唯一の問題dateStringは、Date()コンストラクターが正しく解析するための引数が適切であることです。たとえばYYYYMMDD、質問で指定した形式を使用すると、失敗します。
Francisc

22
この回答にはバグがあります。時計を午前12時1分に設定します。午前12時1分に、c​​alcAge( '2012-03-27')(今日の日付)の場合、1であるべきですが、答えはゼロになります。このバグは午前12:00の時間全体に存在します。これは、1年が365.25日であるという誤った記述が原因です。ありません。私たちは、地球の軌道の長さ(より正確には365.256363日)ではなく、暦年を扱います。うるう年が366日の場合を除き、1年は365日です。その上、このようなパフォーマンスは意味がありません。保守性ははるかに重要です。
Eric Brandel 2013年

1
あなたのソリューションKristofferをありがとう。+ newが単にnewと比較して何をしているのか、また2つのチルダ(〜)を返すのかを尋ねることはできますか?
フランクジェンセン2013年

1
@FrankJensenこんにちはフランク、私も興味があったし、この答えを見つけました:ダブルチルダの変換は、整数に浮くご挨拶
Stano

1
@FrankJensenは、基本的にチルドが浮動小数点数を整数(フロート)に変換する間に数値(バイナリ値)を反転するため、2つのチルドにより丸められた数値が得られます。new Date()の前の+は、オブジェクトを日付オブジェクトの整数表現に変換します。これは、数値の文字列でも使用できます。たとえば、+ '21' === 21
Kristoffer Dorph

55

momentjsの場合:

/* The difference, in years, between NOW and 2012-05-07 */
moment().diff(moment('20120507', 'YYYYMMDD'), 'years')

2
@RicardoPontualこれにはmomentjsが必要なので、最善の答えにはなりません。
itzmukeshy7 2017

13
@ itzmukeshy7確かに、最良の回答を得るには、少なくともjQueryが必要です;)
thomaux

@thomauxそれは完全に開発環境に依存します!
itzmukeshy7 2017年

@ itzmukeshy7リラックス、それは冗談です;)参照:meta.stackexchange.com/a/19492/173875
thomaux

2
@thomaux私はそれが冗談であることを知っていました;)
itzmukeshy7

38

ES6を使用してワンライナーソリューションをクリーニングします。

const getAge = birthDate => Math.floor((new Date() - new Date(birthDate).getTime()) / 3.15576e+10)

// today is 2018-06-13
getAge('1994-06-14') // 23
getAge('1994-06-13') // 24

私は、それぞれ3.15576e + 10ミリ秒(365.25 * 24 * 60 * 60 * 1000)である365.25日(うるう年のために0.25)の年を使用しています。


1
かなりすっきりしました-3.15576e + 10の意味を詳しく説明していただけますか?
leonheess

1
はい、関数の前に次の行を追加するのが良いでしょう:const yearInMs = 3.15576e+10 // Using a year of 365.25 days (because leap years)
ルーカスJanon

12

少し前にその目的で関数を作成しました:

function getAge(birthDate) {
  var now = new Date();

  function isLeap(year) {
    return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
  }

  // days since the birthdate    
  var days = Math.floor((now.getTime() - birthDate.getTime())/1000/60/60/24);
  var age = 0;
  // iterate the years
  for (var y = birthDate.getFullYear(); y <= now.getFullYear(); y++){
    var daysInYear = isLeap(y) ? 366 : 365;
    if (days >= daysInYear){
      days -= daysInYear;
      age++;
      // increment the age only if there are available enough days for the year.
    }
  }
  return age;
}

入力としてDateオブジェクトを使用するため、'YYYYMMDD'フォーマットされた日付文字列を解析する必要があります。

var birthDateStr = '19840831',
    parts = birthDateStr.match(/(\d{4})(\d{2})(\d{2})/),
    dateObj = new Date(parts[1], parts[2]-1, parts[3]); // months 0-based!

getAge(dateObj); // 26

ああ、うるう年を逃した。ありがとうございました。
Francisc

1
これは、選択した日付の組み合わせに無効な値を与えます!たとえば、birthDateある月5日、1980、および現在の日付がさ月4日、2005年には、その関数が誤って報告しますage正しい値が24であること... 25として
ブロック・アダムズ

@BrockAdamsなんでこれ?私は現在この問題を抱えています。ありがとう。
ジャックH

@VisionIncision、これはエッジ条件を適切に処理しないためです。信じられないかもしれませんが、質問のコードが最善のアプローチです-後の回答の1つがより適切に再パッケージ化したようですが。
Brock Adams

CMSこんにちは:-)私はこの質問(stackoverflow.com/questions/16435981/…)を書いて、100%正確な回答が必要な場合は毎年確認するように言われました-うるう年であるかどうか、そして最後の年を計算してください分数。(Guffaの回答を参照)。あなたの関数(その一部)はそれを行います。しかし、どうすれば年齢を100%正確に計算できますか?DOBがまれに1/1 / yyyy .....で始まることはないので、funcを使用して正確な年齢を計算するにはどうすればよいですか?
Royi Namir 2013

10

これが私の解決策です、解析可能な日付を渡すだけです:

function getAge(birth) {
  ageMS = Date.parse(Date()) - Date.parse(birth);
  age = new Date();
  age.setTime(ageMS);
  ageYear = age.getFullYear() - 1970;

  return ageYear;

  // ageMonth = age.getMonth(); // Accurate calculation of the month part of the age
  // ageDay = age.getDate();    // Approximate calculation of the day part of the age
}

7

代替ソリューション、理由:

function calculateAgeInYears (date) {
    var now = new Date();
    var current_year = now.getFullYear();
    var year_diff = current_year - date.getFullYear();
    var birthday_this_year = new Date(current_year, date.getMonth(), date.getDate());
    var has_had_birthday_this_year = (now >= birthday_this_year);

    return has_had_birthday_this_year
        ? year_diff
        : year_diff - 1;
}

5
function age()
{
    var birthdate = $j('#birthDate').val(); // in   "mm/dd/yyyy" format
    var senddate = $j('#expireDate').val(); // in   "mm/dd/yyyy" format
    var x = birthdate.split("/");    
    var y = senddate.split("/");
    var bdays = x[1];
    var bmonths = x[0];
    var byear = x[2];
    //alert(bdays);
    var sdays = y[1];
    var smonths = y[0];
    var syear = y[2];
    //alert(sdays);

    if(sdays < bdays)
    {
        sdays = parseInt(sdays) + 30;
        smonths = parseInt(smonths) - 1;
        //alert(sdays);
        var fdays = sdays - bdays;
        //alert(fdays);
    }
    else{
        var fdays = sdays - bdays;
    }

    if(smonths < bmonths)
    {
        smonths = parseInt(smonths) + 12;
        syear = syear - 1;
        var fmonths = smonths - bmonths;
    }
    else
    {
        var fmonths = smonths - bmonths;
    }

    var fyear = syear - byear;
    document.getElementById('patientAge').value = fyear+' years '+fmonths+' months '+fdays+' days';
}

年月日で年齢を見つけるのは簡単
Sumit Kumar Gupta

5

誕生日がすでに過ぎたかどうかをテストするために、ヘルパー関数を定義しますDate.prototype.getDoY。これは、年の日数を効果的に返します。残りはかなり自明です。

Date.prototype.getDoY = function() {
    var onejan = new Date(this.getFullYear(), 0, 1);
    return Math.floor(((this - onejan) / 86400000) + 1);
};

function getAge(birthDate) {
    function isLeap(year) {
        return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
    }

    var now = new Date(),
        age = now.getFullYear() - birthDate.getFullYear(),
        doyNow = now.getDoY(),
        doyBirth = birthDate.getDoY();

    // normalize day-of-year in leap years
    if (isLeap(now.getFullYear()) && doyNow > 58 && doyBirth > 59)
        doyNow--;

    if (isLeap(birthDate.getFullYear()) && doyNow > 58 && doyBirth > 59)
        doyBirth--;

    if (doyNow <= doyBirth)
        age--;  // birthday not yet passed this year, so -1

    return age;
};

var myBirth = new Date(2001, 6, 4);
console.log(getAge(myBirth));

これにより、2月28日以降の誕生日のうるう年が不正確になります。そのような人々を1日老化させます。EG:DOB =のために2001年7月4日、この機能がオン、7年を返します2008年7月3日
Brock Adams、

@ブロック:ありがとう。私が間違っていなければ、この誤った動作を修正しました。
Marcel Korpel、

はい、私はあなたが持っているかもしれないと思います(厳密にテストされていません、分析されています)。ただし、新しいソリューションはOPのソリューションよりも単純で洗練されていないことに注意してください(このソリューションが関数に適切にカプセル化されていることを除いて)。... OPのソリューションの方が理解しやすい(したがって、監査、テスト、または変更)。時々、シンプルで簡単なのが最善です、IMO。
Brock Adams、

@ブロック:私は完全に同意します:この関数が何をするかについて考えなければならず、それは決して良いことではありません。
Marcel Korpel、2011年

「if(doyNow <doyBirth)」を「if(doyNow <= doyBirth)」にすべきではありませんか?私のすべてのテストで、その日は1日ずれており、それで修正されました。
テッドクルプ、2011

5

私はそれが単にそのようなものであると思う:

function age(dateString){
    let birth = new Date(dateString);
    let now = new Date();
    let beforeBirth = ((() => {birth.setDate(now.getDate());birth.setMonth(now.getMonth()); return birth.getTime()})() < birth.getTime()) ? 0 : 1;
    return now.getFullYear() - birth.getFullYear() - beforeBirth;
}

age('09/20/1981');
//35

タイムスタンプでも機能します

age(403501000000)
//34

このコードは、年間を通して同じ年齢の人を計算します。あなたの例では、今日が'09 / 19/2018 'の場合、コードは37になりますが、年齢(誕生日の前日)は36になります...
Steve Goossens

4

私はこの関数を自分で作成する必要がありました-受け入れられた答えはかなり良いですが、IMOはいくつかのクリーンアップを使用できます。これはdobのUNIXタイムスタンプを必要としますが、これは私の要件でしたが、すぐに文字列を使用するように調整できました。

var getAge = function(dob) {
    var measureDays = function(dateObj) {
            return 31*dateObj.getMonth()+dateObj.getDate();
        },
        d = new Date(dob*1000),
        now = new Date();

    return now.getFullYear() - d.getFullYear() - (measureDays(now) < measureDays(d));
}

measureDays関数でフラットな値31を使用したことに注意してください。計算で重要なのは、「年の日」がタイムスタンプの単調に増加する尺度であることです。

JavaScriptのタイムスタンプまたは文字列を使用している場合、明らかに1000の係数を削除する必要があります。


nは未定義です。getFullYear()
ラリーバトル

4
function getAge(dateString) {

    var dates = dateString.split("-");
    var d = new Date();

    var userday = dates[0];
    var usermonth = dates[1];
    var useryear = dates[2];

    var curday = d.getDate();
    var curmonth = d.getMonth()+1;
    var curyear = d.getFullYear();

    var age = curyear - useryear;

    if((curmonth < usermonth) || ( (curmonth == usermonth) && curday < userday   )){

        age--;

    }

    return age;
}

ヨーロッパの日付が入力された年齢を取得するには:

getAge('16-03-1989')

stackoverflow.com/a/13367162/1055987 good catchでの提案に感謝します。
JFK 2013

3

moment.jsで考えられるもう1つの解決策:

var moment = require('moment');
var startDate = new Date();
var endDate = new Date();
endDate.setDate(endDate.getFullYear() + 5); // Add 5 years to second date
console.log(moment.duration(endDate - startDate).years()); // This should returns 5

2

以前に示した例を確認したところ、すべてのケースで機能しなかったため、独自のスクリプトを作成しました。私はこれをテストしました、そしてそれは完全に機能します。

function getAge(birth) {
   var today = new Date();
   var curr_date = today.getDate();
   var curr_month = today.getMonth() + 1;
   var curr_year = today.getFullYear();

   var pieces = birth.split('/');
   var birth_date = pieces[0];
   var birth_month = pieces[1];
   var birth_year = pieces[2];

   if (curr_month == birth_month && curr_date >= birth_date) return parseInt(curr_year-birth_year);
   if (curr_month == birth_month && curr_date < birth_date) return parseInt(curr_year-birth_year-1);
   if (curr_month > birth_month) return parseInt(curr_year-birth_year);
   if (curr_month < birth_month) return parseInt(curr_year-birth_year-1);
}

var age = getAge('18/01/2011');
alert(age);

2000-02-29から2001-02-28は1年にする必要がありますか?もしそうなら、上記は完璧ではありません。:-)
RobG 2014年

2

それは私にとって最もエレガントな方法です:

const getAge = (birthDateString) => {
  const today = new Date();
  const birthDate = new Date(birthDateString);

  const yearsDifference = today.getFullYear() - birthDate.getFullYear();

  if (
    today.getMonth() < birthDate.getMonth() ||
    (today.getMonth() === birthDate.getMonth() && today.getDate() < birthDate.getDate())
  ) {
    return yearsDifference - 1;
  }

  return yearsDifference;
};

console.log(getAge('2018-03-12'));


1

JavaScriptで生年月日から年齢(年、月、日)を取得します

関数calcularEdad(年、月、日)

function calcularEdad(fecha) {
        // Si la fecha es correcta, calculamos la edad

        if (typeof fecha != "string" && fecha && esNumero(fecha.getTime())) {
            fecha = formatDate(fecha, "yyyy-MM-dd");
        }

        var values = fecha.split("-");
        var dia = values[2];
        var mes = values[1];
        var ano = values[0];

        // cogemos los valores actuales
        var fecha_hoy = new Date();
        var ahora_ano = fecha_hoy.getYear();
        var ahora_mes = fecha_hoy.getMonth() + 1;
        var ahora_dia = fecha_hoy.getDate();

        // realizamos el calculo
        var edad = (ahora_ano + 1900) - ano;
        if (ahora_mes < mes) {
            edad--;
        }
        if ((mes == ahora_mes) && (ahora_dia < dia)) {
            edad--;
        }
        if (edad > 1900) {
            edad -= 1900;
        }

        // calculamos los meses
        var meses = 0;

        if (ahora_mes > mes && dia > ahora_dia)
            meses = ahora_mes - mes - 1;
        else if (ahora_mes > mes)
            meses = ahora_mes - mes
        if (ahora_mes < mes && dia < ahora_dia)
            meses = 12 - (mes - ahora_mes);
        else if (ahora_mes < mes)
            meses = 12 - (mes - ahora_mes + 1);
        if (ahora_mes == mes && dia > ahora_dia)
            meses = 11;

        // calculamos los dias
        var dias = 0;
        if (ahora_dia > dia)
            dias = ahora_dia - dia;
        if (ahora_dia < dia) {
            ultimoDiaMes = new Date(ahora_ano, ahora_mes - 1, 0);
            dias = ultimoDiaMes.getDate() - (dia - ahora_dia);
        }

        return edad + " años, " + meses + " meses y " + dias + " días";
    }

関数esNumero

function esNumero(strNumber) {
    if (strNumber == null) return false;
    if (strNumber == undefined) return false;
    if (typeof strNumber === "number" && !isNaN(strNumber)) return true;
    if (strNumber == "") return false;
    if (strNumber === "") return false;
    var psInt, psFloat;
    psInt = parseInt(strNumber);
    psFloat = parseFloat(strNumber);
    return !isNaN(strNumber) && !isNaN(psFloat);
}

1

私にとっては完璧な作品です。

getAge(birthday) {
    const millis = Date.now() - Date.parse(birthday);
    return new Date(millis).getFullYear() - 1970;
}

0

私はこれが非常に古いスレッドであることを知っていますが、はるかに正確であると私が思う年齢を見つけるために書いたこの実装に入れたかったのです。

var getAge = function(year,month,date){
    var today = new Date();
    var dob = new Date();
    dob.setFullYear(year);
    dob.setMonth(month-1);
    dob.setDate(date);
    var timeDiff = today.valueOf() - dob.valueOf();
    var milliInDay = 24*60*60*1000;
    var noOfDays = timeDiff / milliInDay;
    var daysInYear = 365.242;
    return  ( noOfDays / daysInYear ) ;
}

もちろん、パラメーターを取得する他の形式に合うようにこれを適応させることもできます。これがより良い解決策を探している人に役立つことを願っています。


0

数学の代わりにロジックを使用してこのアプローチを使用しました。正確で迅速です。パラメータは、人の誕生日の年、月、日です。個人の年齢を整数として返します。

function calculateAge(year, month, day) {
        var currentDate = new Date();
        var currentYear = currentDate.getFullYear();
        var currentMonth = currentDate.getUTCMonth() + 1;
        var currentDay = currentDate.getUTCDate();
        // You need to treat the cases where the year, month or day hasn't arrived yet.
        var age = currentYear - year;
        if (currentMonth > month) {
            return age;
        } else {
            if (currentDay >= day) {
                return age;
            } else {
                age--;
                return age;
            }
        }
    }

OPあたりなどの入力のための文字列や日付オブジェクト
ナジム

0

naveenと元のOPの投稿を採用して、文字列とJS Dateオブジェクトの両方またはそのいずれかを受け入れる再利用可能なメソッドスタブを作成しました。

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
 */
function gregorianAge(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)
}

// Below is for the attached snippet

function showAge() {
  $('#age').text(gregorianAge($('#dob').val()))
}

$(function() {
  $(".datepicker").datepicker();
  showAge();
});
<link rel="stylesheet" href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
<script src="//code.jquery.com/jquery-1.10.2.js"></script>
<script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script>

DOB:
<input name="dob" value="12/31/1970" id="dob" class="datepicker" onChange="showAge()" /> AGE: <span id="age"><span>


0

さらに2つのオプション:

// Int Age to Date as string YYY-mm-dd
function age_to_date(age)
{
    try {
        var d = new Date();
        var new_d = '';
        d.setFullYear(d.getFullYear() - Math.abs(age));
        new_d = d.getFullYear() + '-' + d.getMonth() + '-' + d.getDate();

        return new_d;
    } catch(err) {
        console.log(err.message);
    }
}
// Date string (YYY-mm-dd) to Int age (years old)
function date_to_age(date)
{
    try {
        var today = new Date();
        var d = new Date(date);

        var year = today.getFullYear() - d.getFullYear();
        var month = today.getMonth() - d.getMonth();
        var day = today.getDate() - d.getDate();
        var carry = 0;

        if (year < 0)
            return 0;
        if (month <= 0 && day <= 0)
            carry -= 1;

        var age = parseInt(year);
        age += carry;

        return Math.abs(age);
    } catch(err) {
        console.log(err.message);
    }
}

0

以前の回答にいくつか更新しました。

var calculateAge = function(dob) {
    var days = function(date) {
            return 31*date.getMonth() + date.getDate();
        },
        d = new Date(dob*1000),
        now = new Date();

    return now.getFullYear() - d.getFullYear() - ( measureDays(now) < measureDays(d));
}

それが役に立てば幸いです:D


0

年齢を計算する簡単な方法を次に示します。

//dob date dd/mm/yy 
var d = 01/01/1990


//today
//date today string format 
var today = new Date(); // i.e wed 04 may 2016 15:12:09 GMT
//todays year
var todayYear = today.getFullYear();
// today month
var todayMonth = today.getMonth();
//today date
var todayDate = today.getDate();

//dob
//dob parsed as date format   
var dob = new Date(d);
// dob year
var dobYear = dob.getFullYear();
// dob month
var dobMonth = dob.getMonth();
//dob date
var dobDate = dob.getDate();

var yearsDiff = todayYear - dobYear ;
var age;

if ( todayMonth < dobMonth ) 
 { 
  age = yearsDiff - 1; 
 }
else if ( todayMonth > dobMonth ) 
 {
  age = yearsDiff ; 
 }

else //if today month = dob month
 { if ( todayDate < dobDate ) 
  {
   age = yearsDiff - 1;
  }
    else 
    {
     age = yearsDiff;
    }
 }

0
var now = DateTime.Now;
var age = DateTime.Now.Year - dob.Year;
if (now.Month < dob.Month || now.Month == dob.Month && now.Day < dob.Day) age--;

現在と誕生年の間の単純な年差を行います。次に、今日が誕生日よりも早い場合は、1年を差し引きます(考えてみてください。あなたの誕生日は、その年の中で上昇します)
Steve Goossens

0

これをフォームの年齢制限に使用できます-

function dobvalidator(birthDateString){
    strs = birthDateString.split("-");
    var dd = strs[0];
    var mm = strs[1];
    var yy = strs[2];

    var d = new Date();
    var ds = d.getDate();
    var ms = d.getMonth();
    var ys = d.getFullYear();
    var accepted_age = 18;

    var days = ((accepted_age * 12) * 30) + (ms * 30) + ds;
    var age = (((ys - yy) * 12) * 30) + ((12 - mm) * 30) + parseInt(30 - dd);

    if((days - age) <= '0'){
        console.log((days - age));
        alert('You are at-least ' + accepted_age);
    }else{
        console.log((days - age));
        alert('You are not at-least ' + accepted_age);
    }
}

0

私は少し遅すぎますが、これが誕生日を計算する最も簡単な方法であることがわかりました。

$(document).ready(init);

function init()
{
  writeYears("myage", 0, Age());
  $(".captcha").click(function()
  {
    reloadCaptcha();
  });

}

function Age()
{
    var birthday = new Date(1997, 02, 01),  //Year, month, day.
        today = new Date(),
        one_year = 1000*60*60*24*365;
    return Math.floor( (today.getTime() - birthday.getTime() ) / one_year);
}

function writeYears(id, current, maximum)
{
  document.getElementById(id).innerHTML = current;

  if (current < maximum)
  {
    setTimeout( function() { writeYears(id, ++current, maximum); }, Math.sin( current/maximum ) * 200 );
    }
}

HTMLタグ:

<span id="myage"></span>

うまくいけば、これが役立ちます。


-1

ここに私が思いつくことができる最も簡単で最も正確な解決策があります:

Date.prototype.getAge = function (date) {
    if (!date) date = new Date();
    return ~~((date.getFullYear() + date.getMonth() / 100
    + date.getDate() / 10000) - (this.getFullYear() + 
    this.getMonth() / 100 + this.getDate() / 10000));
}

また、ここでは、毎年2月29日-> 2月28日を考慮するサンプルを示します。

Date.prototype.getAge = function (date) {
    if (!date) date = new Date();
    var feb = (date.getMonth() == 1 || this.getMonth() == 1);
    return ~~((date.getFullYear() + date.getMonth() / 100 + 
        (feb && date.getDate() == 29 ? 28 : date.getDate())
        / 10000) - (this.getFullYear() + this.getMonth() / 100 + 
        (feb && this.getDate() == 29 ? 28 : this.getDate()) 
        / 10000));
}

負の年齢でも機能します!


他のすべてと同様に、2000-02-29から2001-02-28はゼロ年であると考えています。
RobG 2014年

うるう年のエッジケースに対応するために、回答を更新しました。ありがとう@RobG
wizulus

-1

さらに別の解決策:

/**
 * Calculate age by birth date.
 *
 * @param int birthYear Year as YYYY.
 * @param int birthMonth Month as number from 1 to 12.
 * @param int birthDay Day as number from 1 to 31.
 * @return int
 */
function getAge(birthYear, birthMonth, birthDay) {
  var today = new Date();
  var birthDate = new Date(birthYear, birthMonth-1, birthDay);
  var age = today.getFullYear() - birthDate.getFullYear();
  var m = today.getMonth() - birthDate.getMonth();
  if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
    age--;
  }
  return age;
}

-1

momentjs「fromNow」方法は、これが、すなわち、フォーマットされた日付で動作することができます:1968年3月15日

var dob = document.getElementByID("dob"); var age = moment(dob.value).fromNow(true).replace(" years", "");

//fromNow(true) => suffix "ago" is not displayed //but we still have to get rid of "years";

プロトタイプ版として

String.prototype.getAge = function() {
return moment(this.valueOf()).fromNow(true).replace(" years", "");

}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.