Hitung usia yang diberikan tanggal lahir dalam format YYYYMMDD

285

Bagaimana saya bisa menghitung usia dalam tahun, mengingat tanggal lahir format YYYYMMDD? Apakah mungkin menggunakan Date()fungsi ini?

Saya mencari solusi yang lebih baik daripada yang saya gunakan sekarang:

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);

Francisc
sumber
Harap perhatikan format Anda, jangan lakukan seperti yang Anda lakukan; indentasi kode Anda dengan 4 spasi menggunakan tombol kode (010101) atau Ctrl-K.
Marcel Korpel
Saya lakukan tetapi gagal untuk bekerja pada IE9 Beta jadi saya harus melakukannya dengan tangan.
Francisc
4
Solusi asli Anda lebih baik, dalam menghitung usia, daripada jawaban saat ini. Jawaban Júlio Santos pada dasarnya adalah hal yang sama. Jawaban lain memberikan hasil yang tidak akurat dalam banyak kondisi, dan mungkin kurang langsung atau kurang efisien.
Brock Adams
Brock terima kasih. Saya berharap ada cara yang lebih elegan untuk melakukan ini daripada apa yang tampaknya agak kasar.
Francisc
4
@ Francisc, ini mentah, tapi itu yang Dateharus dilakukan objek jika dienkapsulasi. Orang-orang bisa menulis buku tentang kesederhanaan Datepenanganan JS . ... Jika Anda bisa hidup dengan kadang-kadang libur sehari, maka perkiraannya: AgeInYears = Math.floor ( (now_Date - DOB_Date) / 31556952000 )sesederhana mungkin.
Brock Adams

Jawaban:

246

Saya akan membaca:

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);
}

Penafian: Ini juga memiliki masalah presisi, jadi ini tidak dapat sepenuhnya dipercaya. Ini bisa dimatikan beberapa jam, beberapa tahun, atau selama musim panas (tergantung zona waktu).

Sebagai gantinya saya akan merekomendasikan menggunakan perpustakaan untuk ini, jika presisi sangat penting. Juga @Naveens post, mungkin yang paling akurat, karena tidak bergantung pada waktu.


Benchmark: http://jsperf.com/birthday-calculation/15

André Snede Kock
sumber
3
Ini mengembalikan 0 tahun untuk tanggal seperti 2000-02-29 hingga 2001-02-28 ketika mungkin harus mengembalikan 1.
RobG
16
@ RagG Saya tidak berpikir satu tahun penuh secara teknis telah berlalu dari 2000-02-29 hingga 2001-02-28, membuat jawaban Anda tidak valid. Tidak masuk akal, 2000-02-28 hingga 2001-02-28 adalah tahun, jadi 2000-02-29 hingga 2001-02-28, harus kurang dari setahun.
André Snede Kock
3
Anda tidak merinci apa artinya "tidak tepat", saya pikir informasi tambahan mungkin bermanfaat. Anda mungkin mempertimbangkan untuk memperbaiki masalah atau menghapus jawabannya.
RobG
1
@ RagG Sebenarnya saya lakukan. Saya juga menunjuk solusi yang lebih baik daripada solusi saya sendiri. Solusi saya memecahkan masalah dengan cara yang mudah dibaca, dengan masalah presisi kecil, tetapi dalam batas-batas tujuannya.
André Snede Kock
1
Jawaban indah @ AndréSnedeHansen dan cepat juga, karena Anda tidak memiliki divisi gila seperti yang ada dalam jawaban saya ;-) +1 untuk keterbacaan dan kecepatan.
Kristoffer Dorph
507

Coba ini.

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;
}

Saya percaya satu-satunya hal yang tampak kasar pada kode Anda adalah substrbagian.

Fiddle : http://jsfiddle.net/codeandcloud/n33RJ/

naveen
sumber
Bisakah Anda memberikan contoh penggunaan? Saya tidak bisa menjalankannya tanpa memodifikasi fungsi untuk mengambil 3 argumen terpisah, seperti: getAge (y, m, d). Misalnya: jsbin.com/ehaqiw/1/edit
edt
Seperti banyak orang lain, ini berpikir bahwa 2000-02-29 hingga 2001-02-28 adalah nol tahun, ketika kemungkinan besar harus 1 (sejak 2001-03-01 harus 1 tahun 1 hari).
RobG
3
@RobG: ketika melompati 'merayakan' (jawaban umum untuk pertanyaan itu hanya tampaknya adalah: 'akhir pekan yang paling dekat dengan tanggal sebenarnya') hari kelahiran mereka berbeda berdasarkan konteks termasuk: wilayah geografis (bahasa Inggris sederhana: tempat tinggal Anda ), HUKUM (jangan meremehkan itu), agama dan preferensi pribadi (termasuk perilaku kelompok): Beberapa alasan: "Saya lahir di bulan Februari", alasan lain: "Saya lahir sehari setelah 28 Februari" (yang paling umum 1 Maret) en.wikipedia.org/wiki/February_29 Untuk semua hal di atas, algo ini benar JIKA 1 Maret adalah hasil akhir yang diperlukan
GitaarLAB
3
@RobG: Lenyapnya 'tambah x bulan' tidak relevan dengan gagasan manusia tentang usia selama bertahun-tahun. Gagasan manusia yang umum adalah bahwa usia (InYears) -counter bertambah setiap hari (mengabaikan waktu) ketika kalender memiliki # bulan dan # hari yang sama (dibandingkan dengan tanggal mulai): sehingga 2000-02-28 hingga 2001-02 -27 = 0 tahun dan 2000-02-28 hingga 2001-02-28 = 1 tahun. Memperluas 'akal sehat' menjadi lompatan: 2000-02-29 (sehari setelah 2000-02-28) hingga 2001-02-28 = nol tahun . Komentar saya hanya menyatakan bahwa algo jawab selalu memberikan jawaban manusia yang 'benar' JIKA seseorang mengharapkan / menyetujui logika ini untuk melompat.
GitaarLAB
3
@RobG: Saya tidak pernah mengatakan saya atau jawabannya secara universal benar (TM). Saya memasukkan gagasan tentang konteks / yurisdiksi / pandangan. Kedua komentar saya jelas termasuk huruf besar IF (ke arah penanganan leaplings pengecualian). Sebenarnya, komentar pertama saya menyatakan dengan tepat apa yang saya katakan dan tidak pernah memasukkan penilaian tentang benar atau salah. Akibatnya komentar saya mengklarifikasi apa dan apa yang tidak diharapkan (dan mengapa) dari jawaban ini (seperti yang Anda sebut 'sorot masalah'). P: 31 Februari?!?
GitaarLAB
72

Penting: Jawaban ini tidak memberikan jawaban yang 100% akurat, tidak aktif sekitar 10-20 jam tergantung pada tanggal.

Tidak ada solusi yang lebih baik (toh tidak dalam jawaban ini). - naveen

Tentu saja saya tidak bisa menahan diri untuk menerima tantangan dan membuat kalkulator ulang tahun yang lebih cepat dan lebih pendek daripada solusi yang diterima saat ini. Poin utama untuk solusi saya, adalah matematika itu cepat, jadi alih-alih menggunakan percabangan, dan model tanggal javascript menyediakan untuk menghitung solusi, kami menggunakan matematika yang luar biasa

Jawabannya terlihat seperti ini, dan berjalan ~ 65% lebih cepat dari naveen plus jauh lebih pendek:

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

Angka ajaib: 31557600000 adalah 24 * 3600 * 365.25 * 1000 Yang merupakan panjang tahun, panjang tahun adalah 365 hari dan 6 jam yaitu 0,25 hari. Pada akhirnya saya menemukan hasil yang memberi kita usia akhir.

Inilah tolok ukurnya: http://jsperf.com/birthday-calculation

Untuk mendukung format data OP, Anda dapat menggantinya +new Date(dateString);
dengan+new Date(d.substr(0, 4), d.substr(4, 2)-1, d.substr(6, 2));

Jika Anda dapat menemukan solusi yang lebih baik, silakan berbagi! :-)

Kristoffer Dorph
sumber
Itu solusi yang sangat keren. Satu-satunya masalah yang saya lihat adalah dateStringargumen yang tepat untuk konstruktor Date () untuk menguraikannya dengan benar. Misalnya, mengambil YYYYMMDDformat yang saya berikan dalam pertanyaan, itu akan gagal.
Francisc
22
Jawaban ini memiliki bug di dalamnya. Atur jam Anda menjadi 12:01 pagi. Pada pukul 12:01, jika Anda menghitung ('2012-03-27') (tanggal hari ini), Anda akan mendapatkan jawaban nol, meskipun harus sama dengan 1. Bug ini ada selama jam 12:00 pagi. Ini karena pernyataan yang salah bahwa satu tahun memiliki 365,25 hari di dalamnya. Itu tidak. Kita berhadapan dengan tahun kalender, bukan panjang orbit Bumi (yang lebih akurat 365,256363 hari). Satu tahun memiliki 365 hari, kecuali tahun kabisat yang memiliki 366 hari. Selain itu, kinerja pada hal seperti ini tidak ada artinya. Pemeliharaan jauh lebih penting.
Eric Brandel
1
Terima kasih atas solusi Anda, Kristoffer. Bisakah saya bertanya apa yang + baru lakukan dibandingkan dengan yang baru, dan juga dua tilde (~) sebagai imbalannya?
Frank Jensen
1
@ FrankJensen Hai Frank, saya juga penasaran dan menemukan jawaban ini: double tilde convert float to integer Greetings
Stano
1
@ FrankJensen pada dasarnya tilde membalikkan angka (nilai biner) sementara mengkonversi float ke integer (lantai), karenanya, dua tilde memberi Anda angka bulat. Tanda + di depan Date baru () mengubah objek menjadi representasi bilangan bulat dari objek tanggal, ini juga dapat digunakan dengan string angka misalnya + '21 '=== 21
Kristoffer Dorph
55

Dengan momentjs:

/* The difference, in years, between NOW and 2012-05-07 */
moment().diff(moment('20120507', 'YYYYMMDD'), 'years')
Vitor Tyburski
sumber
2
@RicardoPontual ini membutuhkan momentjs, jadi tidak bisa menjadi jawaban terbaik.
itzmukeshy7
13
@ itzmukeshy7 memang, untuk jawaban yang terbaik, setidaknya harus memerlukan jQuery;)
thomaux
@ thomaux Ini sangat tergantung pada lingkungan pengembangan!
itzmukeshy7
@ itzmukeshy7 santai, ini lelucon;) lihat: meta.stackexchange.com/a/19492/173875
thomaux
2
@ thomaux Saya tahu ini lelucon;)
itzmukeshy7
38

Bersihkan solusi satu-liner menggunakan 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

Saya menggunakan tahun 365,25 hari (0,25 karena tahun kabisat) yaitu 3,15576e + 10 milidetik (365,25 * 24 * 60 * 60 * 1000) masing-masing.

Lucas Janon
sumber
1
Sangat rapi - bisakah Anda menguraikan apa arti 3.15576e + 10?
leonheess
1
Ya, akan lebih baik untuk menambahkan baris berikut sebelum fungsi:const yearInMs = 3.15576e+10 // Using a year of 365.25 days (because leap years)
Lucas Janon
12

Beberapa waktu lalu saya membuat fungsi dengan tujuan itu:

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;
}

Dibutuhkan objek Date sebagai input, jadi Anda perlu mengurai 'YYYYMMDD'string tanggal yang diformat:

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
CMS
sumber
Ah ya, saya melewatkan tahun kabisat. Terima kasih.
Francisc
1
Ini memberikan nilai yang tidak valid untuk kombinasi tanggal tertentu! Misalnya, jika birthDateadalah 5 Januari 1980 , dan tanggal saat ini 4 Januari 2005 , maka fungsi akan keliru melaporkan age25 ... Nilai yang benar menjadi 24.
Brock Adams
@ BatuAdams Mengapa ini? Saya mengalami masalah ini saat ini. Terima kasih.
Jack H
@VisionIncision, karena tidak menangani kondisi tepi dengan benar. Percaya atau tidak, kode dari pertanyaan adalah pendekatan terbaik - meskipun sepertinya salah satu jawaban di kemudian hari mungkin telah mengemasnya kembali dengan lebih tepat.
Brock Adams
CMS Hai :-) Saya menulis pertanyaan ini ( stackoverflow.com/questions/16435981/... ) dan saya diberitahu bahwa jika saya ingin jawaban akurat 100% saya harus memeriksa setiap tahun - jika ini adalah tahun kabisat, dan kemudian kalkir yang terakhir pecahan. (lihat jawaban Guffa). Fungsi Anda (sebagian darinya) melakukan itu . tetapi bagaimana saya bisa menggunakannya untuk menghitung usia 100% akurat? DOB jarang dimulai pada 1/1 / yyyy ..... jadi bagaimana saya bisa menggunakan func Anda untuk menghitung usia yang tepat?
Royi Namir
10

Inilah solusi saya, cukup berikan tanggal yang dapat diuraikan:

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
}
Kinergy
sumber
7

Solusi alternatif, karena mengapa tidak:

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;
}
Josh
sumber
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';
}
Sarwar
sumber
Terima kasih mudah untuk menemukan umur dalam hitungan bulan dan hari
Sumit Kumar Gupta
5

Untuk menguji apakah ulang tahun telah berlalu atau belum, saya mendefinisikan fungsi pembantu Date.prototype.getDoY, yang secara efektif mengembalikan jumlah hari dalam setahun. Sisanya cukup jelas.

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));
Marcel Korpel
sumber
Ini memberikan hasil yang tidak akurat dalam tahun kabisat, untuk ulang tahun setelah 28 Februari. Itu menua orang-orang seperti oleh 1 hari. EG: untuk DoB = 2001/07/04 , fungsi ini akan kembali 7 tahun, pada 2008/07/03 .
Brock Adams
@ Batu: Terima kasih. Jika saya tidak salah, saya telah memperbaiki perilaku yang salah ini.
Marcel Korpel
Ya, saya pikir Anda mungkin (belum diuji secara ketat, baru dianalisis). Tetapi, perhatikan bahwa solusi baru tidak lebih sederhana dan tidak lebih elegan dari solusi OP (tidak termasuk bahwa solusi ini dienkapsulasi dengan benar dalam suatu fungsi). ... Solusi OP lebih mudah dipahami (dengan demikian untuk mengaudit, menguji, atau memodifikasi). Terkadang sederhana dan terus terang adalah yang terbaik, IMO.
Brock Adams
@ Rock: Saya sepenuhnya setuju: Saya harus berpikir tentang apa fungsi ini dan itu tidak pernah merupakan hal yang baik.
Marcel Korpel
Tidakkah seharusnya "jika (doyNow <doyBirth)" menjadi "if (doyNow <= doyBirth)"? Dalam semua tes saya, hari telah dimatikan oleh satu dan itu memperbaikinya.
Ted Kulp
5

Saya pikir itu bisa saja seperti itu:

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

Bekerja juga dengan stempel waktu

age(403501000000)
//34
romuleald
sumber
Kode ini akan menghitung seseorang yang memiliki usia yang sama sepanjang tahun. Dalam contoh Anda, jika hari ini adalah '09 / 19/2018 'kode akan memberi 37, tetapi usia (hari sebelum ulang tahun) adalah 36 ...
Steve Goossens
4

Saya hanya harus menulis fungsi ini untuk diri saya sendiri - jawaban yang diterima cukup bagus tetapi IMO dapat menggunakan beberapa pembersihan. Ini membutuhkan cap waktu unix untuk dob karena itu adalah persyaratan saya tetapi dapat dengan cepat disesuaikan untuk menggunakan string:

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));
}

Perhatikan Saya telah menggunakan nilai tetap dari 31 pada fungsi pengukuran saya. Semua perhitungan peduli adalah bahwa "hari-of-year" menjadi ukuran timestamp yang meningkat secara monoton.

Jika menggunakan cap waktu atau string javascript, jelas Anda ingin menghapus faktor 1000.

Keith Nordstrom
sumber
n tidak ditentukan. Saya pikir maksud Anda sekarang. GetFullYear ()
Larry Battle
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;
}

Untuk mendapatkan usia saat tanggal Eropa telah masuk:

getAge('16-03-1989')
Martijn van Hoof
sumber
Terima kasih atas saran Anda di stackoverflow.com/a/13367162/1055987 tangkapan yang bagus.
JFK
3

Satu lagi solusi yang mungkin dengan moment.js :

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
Michael Yurin
sumber
2

Saya telah memeriksa contoh yang ditunjukkan sebelumnya dan mereka tidak berfungsi dalam semua kasus, dan karena ini saya membuat skrip saya sendiri. Saya menguji ini, dan itu bekerja dengan sempurna.

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);
paulinho
sumber
Haruskah 2000-02-29 hingga 2001-02-28 menjadi satu tahun? Jika demikian, maka di atas tidak sempurna. :-)
RobG
2

Itu cara paling elegan bagi saya:

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'));

Krzysztof Dąbrowski
sumber
1

Dapatkan usia (tahun, bulan, dan hari) dari tanggal lahir dengan javascript

Fungsi calcularEdad (tahun, bulan, dan hari)

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";
    }

Fungsi 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);
}
Angeldev
sumber
1

Bekerja sempurna untukku, kawan.

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

Saya tahu ini adalah utas yang sangat lama tetapi saya ingin memasukkan implementasi ini yang saya tulis untuk menemukan usia yang saya yakini jauh lebih akurat.

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 ) ;
}

Tentu Anda bisa menyesuaikan ini agar sesuai dengan format lain untuk mendapatkan parameter. Semoga ini bisa membantu seseorang mencari solusi yang lebih baik.

Ganaraj
sumber
0

Saya menggunakan pendekatan ini menggunakan logika, bukan matematika. Ini tepat dan cepat. Parameternya adalah tahun, bulan, dan hari ulang tahun orang tersebut. Ini mengembalikan usia seseorang sebagai bilangan bulat.

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;
            }
        }
    }
Pedro Alvares
sumber
string atau objek tanggal untuk input sesuai OP
nazim
0

Mengadopsi dari tulisan OP naveen dan OP asli saya berakhir dengan metode rintisan yang dapat digunakan kembali yang menerima baik string dan / atau objek Date JS.

Saya menamainya gregorianAge()karena perhitungan ini memberikan persis bagaimana kita menunjukkan usia menggunakan kalender Gregorian. yaitu Tidak menghitung akhir tahun jika bulan dan hari sebelum bulan dan hari tahun kelahiran.

/**
 * 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>

Nazim
sumber
0

Dua opsi lagi:

// 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);
    }
}
rsnoopy
sumber
0

Saya sudah melakukan beberapa pembaruan untuk satu jawaban sebelumnya.

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));
}

Saya harap ini membantu: D

Fabricio
sumber
0

di sini adalah cara sederhana menghitung usia:

//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;
    }
 }
SSS
sumber
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--;
DBoi
sumber
Itu perbedaan tahun yang sederhana antara sekarang dan tahun kelahiran. Maka dikurangi satu tahun jika hari ini lebih awal dalam tahun daripada ulang tahun (pikirkan tentang hal itu, usia Anda naik sepanjang tahun, pada hari ulang tahun Anda)
Steve Goossens
0

Anda dapat menggunakan ini untuk batasan usia dalam formulir Anda -

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);
    }
}
IshaniNet
sumber
0

Saya sedikit terlambat tetapi saya menemukan ini sebagai cara paling sederhana untuk menghitung tanggal lahir.

$(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 );
    }
}

Tag HTML:

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

Semoga ini bisa membantu.

TWDbag
sumber
-1

Inilah solusi paling sederhana dan paling akurat yang dapat saya berikan:

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));
}

Dan di sini adalah contoh yang akan mempertimbangkan 29 Feb -> 28 Feb setahun.

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));
}

Bahkan bekerja dengan usia negatif!

wizulus
sumber
Seperti yang lainnya, menurutnya 2000-02-29 hingga 2001-02-28 adalah nol tahun.
RobG
Saya telah memperbarui jawaban saya untuk mengakomodasi kasus tahun kabisat. Terima kasih @RGG
wizulus
-1

Solusi lain:

/**
 * 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;
}
xexsus
sumber
-1

Dengan metode "fromNow" saat ini, ini memungkinkan Anda untuk bekerja dengan tanggal yang diformat, yaitu: 03/15/1968

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";

Sebagai versi prototipe

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

}

Nicolas Giszpenc
sumber