Doğum tarihi verilen yaşı YYYYMMDD formatında hesaplayın


285

YYYYMMDD biçiminde bir doğum tarihi verildiğinde, bir yaşı nasıl hesaplayabilirim? Kullanarak mümkün müDate()Fonksiyonu ?

Şu anda kullandığımdan daha iyi bir çözüm arıyorum:

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


Lütfen biçimlendirmenize dikkat edin, yaptığınız gibi yapmayın; kod (010101) düğmesini veya Ctrl-K tuşunu kullanarak kodunuzu 4 boşlukla girin.
Marcel Korpel

Yaptım ama IE9 Beta üzerinde çalışamıyor, bu yüzden elle yapmak zorunda kaldım.
Francisc

4
Orijinal çözümünüz, yaşın hesaplanmasında mevcut cevaplardan daha iyidir. Júlio Santos'un cevabı aslında aynı şeydir. Diğer cevaplar birçok koşulda yanlış sonuçlar verir ve daha az basit veya daha az verimli olabilir.
Brock Adams

Teşekkür ederim Brock. Bunu yapmanın biraz kaba görünenden daha zarif bir yol olmasını umuyordum.
Francisc

4
@Francisc, kaba, ama Datenesnenin kapsüllenmesi halinde ne yapması gerekecekti. İnsanlar JS'nin idaresinin berbatlığı hakkında kitaplar yazabilirler Date. ... Bazen bir gün izinli olarak yaşayabiliyorsanız, o zaman yaklaşım: AgeInYears = Math.floor ( (now_Date - DOB_Date) / 31556952000 )alabileceğiniz kadar basittir.
Brock Adams

Yanıtlar:


245

Okunabilirlik için giderdim:

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

Yasal Uyarı: Bunun da hassas sorunları vardır, bu yüzden de tamamen güvenilir olamaz. Birkaç saat, birkaç yıl içinde veya gün ışığından yararlanma sırasında (saat dilimine bağlı olarak) kapalı olabilir.

Bunun yerine, hassasiyet çok önemliyse bunun için bir kütüphane kullanmanızı tavsiye ederim. Ayrıca @Naveens post, günün saatine bağlı olmadığı için muhtemelen en doğrudur.


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


3
Bu, muhtemelen 1'e dönmesi gerektiğinde 2000-02-29 ile 2001-02-28 gibi tarihler için 0 yıl döndürür
RobG

16
@RobG Teknik olarak tam bir yılın 2000-02-29'dan 2001-02-28'e geçtiğini ve cevabınızı geçersiz kıldığını sanmıyorum. 2000-02-28 ila 2001-02-28 bir yıl, bu nedenle 2000-02-29 ila 2001-02-28 bir yıl daha az olmalıdır.
André Snede Kock

3
"Kesin olmayan" ne anlama geldiğinden bahsetmediniz, ek bilgilerin yardımcı olabileceğini düşündüm. Sorunları çözmeyi veya yanıtı silmeyi düşünebilirsiniz.
RobG

1
@RobG Aslında yaptım. Ben de kendiminkinden daha iyi bir çözüme işaret ettim. Çözümüm, problemi kolay okunan bir şekilde, küçük hassasiyet sorunları ile, ancak amacının sınırları dahilinde çözüyor.
André Snede Kock

1
Güzel cevap @ AndréSnedeHansen ve hızlı, çünkü cevabımda mevcut olan bu çılgın bölünme yok; okunabilirlik ve hız için +1 +1.
Kristoffer Dorph

506

Bunu dene.

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

Kodunuzda kaba görünen tek şey, substr parçası .

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


Bir kullanım örneği verebilir misiniz? Gibi 3 ayrı argüman almak için işlevi değiştirmeden çalışmasını alamadım: getAge (y, m, d). Örneğin: jsbin.com/ehaqiw/1/edit
edt

Diğerleri gibi, bu da 2000-02-29 ila 2001-02-28'in sıfır olması, büyük olasılıkla 1 olması gerektiği zaman olduğunu düşünmektedir (2001-03-01'den beri 1 yıl 1 gün olmalıdır).
RobG

3
@RobG: sızıntılar 'kutladığında' (bu sorunun ortak cevabı aslında sadece 'gerçek tarihe en yakın hafta sonu' gibi görünüyor) doğum günleri aşağıdakileri içeren bağlama göre değişir : coğrafi bölge (basit İngilizce: yaşadığınız yer) ), LAW (bunu hafife alma), din ve kişisel tercih (grup davranışı dahil): Bazı nedenler: "Şubat ayında doğdum", diğerleri neden: "28 Şubat'tan sonraki gün doğdum" (en yaygın olarak 1 Mart) en.wikipedia.org/wiki/February_29 Yukarıdakilerin hepsi için bu 1 Mart doğru ise, 1 Mart kişinin ihtiyaç duyduğu leapyear
sonucuysa

3
@RobG: 'Artı x ay (lar)' ın mezarlığı, yıllar içindeki insanlık nosyonuyla alakasız. Yaygın insan düşüncesi, takvim (# tarih) ile aynı ay (başlangıç ​​tarihine kıyasla) olduğunda, yaş (InYears) sayacının her gün (zamanı göz ardı ederek) artmasıdır: böylece 2000-02-28 - 2001-02 -27 = 0 yıl ve 2000-02-28 - 2001-02-28 = 1 yıl. Bu 'sağduyu'yu sızıntılara genişletmek: 2000-02-29 (2000-02-28'den sonraki gün ) 2001-02-28 = sıfır yıl . Benim yorumum sadece cevaplanan algo'nun bu mantığa sızıntılar için beklerse / kabul ederse daima 'doğru' insan cevabını verdiğini belirtti.
GitaarLAB

3
@RobG: Asla ben veya cevabın evrensel olarak doğru olduğunu söylemedim (TM). Bağlamlar / yargı alanları / görüşler kavramını dahil ettim. Her iki yorumum da açıkça bir büyük harf IF (istisna sızıntılarının işlenmesine doğru) içerir. Aslında, ilk yorumum tam olarak ne demek istediğimi ifade etti ve hiçbir zaman doğru ya da yanlış hakkında herhangi bir yargı içermedi. Aslında yorumlarım bu cevaptan neyi beklemeyeceğinizi (neyi beklemeyeceğinizi (ve nedenini) açıklığa kavuşturuyor ('sorunları vurgulayın' dediğinizde). Ps: 31 Şubat?!?
GitaarLAB

72

Önemli: Bu cevap% 100 doğru cevap vermez, tarihe bağlı olarak yaklaşık 10-20 saat kapalıdır.

Daha iyi bir çözüm yoktur (bu cevaplarda zaten yoktur). - naveen

Elbette meydan okuma ve mevcut kabul edilen çözümden daha hızlı ve daha kısa bir doğum günü hesap makinesi yapma dürtüsüne karşı koyamadım. Benim çözümüm için ana nokta, matematik hızlı olduğunu, bu yüzden dallanma kullanmak yerine, javascript ve harika matematik kullandığımız bir çözüm hesaplamak için sağladığı tarih modeli

Cevap şuna benziyor ve naveen'den ~% 65 daha hızlı çalışıyor ve çok daha kısa:

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

Sihir numarası: 31557600000 24 * 3600 * 365.25 * 1000'dir Bir yıl uzunluğu, bir yıl uzunluğu 365 gün ve 6 saat olan 0.25 gündür. Sonunda bize son yaşı veren sonucu katlarım.

İşte kriterler: http://jsperf.com/birthday-calculation

OP'nin veri formatını desteklemek için değiştirebilirsiniz +new Date(dateString);
ile+new Date(d.substr(0, 4), d.substr(4, 2)-1, d.substr(6, 2));

Daha iyi bir çözüm bulabilirseniz lütfen paylaşın! :-)


Bu çok güzel bir çözüm. Onunla gördüğüm tek sorun dateStringargüman sadece Date () yapıcı doğru ayrıştırmak için doğru olmasıdır. Örneğin YYYYMMDD, soruda verdiğim formatı alırsak başarısız olur.
Francisc

22
Bu cevapta bir hata var. Saatinizi 12: 01'e ayarlayın. Saat 12: 01'de ('2012-03-27') (bugünün tarihi) calcAge yaparsanız, 1'e eşit olması gerekirken sıfır yanıtı alırsınız. Bu hata saat 12: 00'da mevcut. Bu, bir yılda 365.25 gün olduğu yanlış beyanından kaynaklanmaktadır. O değil. Dünya yörüngesinin uzunluğu değil, daha doğru 365.256363 gün olan takvim yıllarıyla ilgileniyoruz. Bir yılda 366 gün olan artık yıl hariç 365 gün vardır. Bunun yanı sıra, böyle bir şey üzerinde performans anlamsızdır. Sürdürülebilirlik çok daha önemlidir.
Eric Brandel

1
Çözümünüz için teşekkürler Kristoffer. + Yeni'nin sadece yeni ile karşılaştırıldığında ne yaptığını ve aynı zamanda iki tilde'nin (~) ne olduğunu sorabilir miyim?
Frank Jensen

1
@FrankJensen Merhaba Frank, ben de merak ettim ve bu cevabı buldum: çift ​​tilde şamandırayı tamsayıya dönüştürür Selamlar
Stano

1
@FrankJensen esas olarak tilde sayıyı (ikili değer) ters çevirirken float'ı tamsayıya (katlanmış) dönüştürürken, iki tilde size yuvarlanmış sayıyı verir. Yeni Date ()
öğesinin önündeki

55

Momentjs ile:

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

2
@RicardoPontual bu momentjs gerektirir, bu yüzden en iyi cevap olamaz.
itzmukeshy7

13
@ itzmukeshy7 gerçekten, bir yanıtın en iyisi olması için en azından jQuery gerektirmesi gerekir;)
thomaux

@thomaux Tamamen geliştirme ortamına bağlıdır!
itzmukeshy7

@ itzmukeshy7 rahatlayın, bu bir şaka;) bkz: meta.stackexchange.com/a/19492/173875
thomaux

2
@thomaux Bunun bir şaka olduğunu biliyordum;)
itzmukeshy7

38

Tek astarlı çözümü ES6 kullanarak temizleyin:

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

Sırasıyla 3.15576e + 10 milisaniye (365.25 * 24 * 60 * 60 * 1000) olan 365.25 gün (artık yıllar nedeniyle 0.25) kullanıyorum.


1
Oldukça temiz - 3.15576e + 10'un ne anlama geldiğini ayrıntılandırabilir misiniz?
leonheess

1
Evet, fonksiyondan önce aşağıdaki satırı eklemek iyi olur:const yearInMs = 3.15576e+10 // Using a year of 365.25 days (because leap years)
Lucas Janon

12

Bir süre önce bu amaçla bir işlev yaptım:

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

Bir Date nesnesini girdi olarak alır, bu nedenle 'YYYYMMDD'biçimlendirilmiş tarih dizesini ayrıştırmanız gerekir :

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

Ah evet, artık yılı kaçırdım. Teşekkür ederim.
Francisc

1
Bu, belirli tarih kombinasyonları için geçersiz değerler verir! Örneğin, birthDatebir 5 Ocak 1980 ve geçerli tarih olan 4 Ocak 2005 , işlev hatalı rapor verecek agedoğru değeri 24. olmak ... 25 olarak
Brock Adams

@BrockAdams Neden bu? Şu anda bu sorunu yaşıyorum. Teşekkürler.
Jack H

@VisionIncision, çünkü kenar koşullarını düzgün işlemiyor. İster inanın ister inanmayın, sorudaki kod en iyi yaklaşımdır - daha sonraki cevaplardan biri daha uygun bir şekilde yeniden paketlenmiş gibi görünmesine rağmen.
Brock Adams

CMS Merhaba :-) Bu soruyu yazdım ( stackoverflow.com/questions/16435981/… ) ve% 100 doğru cevap istiyorsam her yıl kontrol etmem gerektiği söylendi - artık bir yıl ise ve sonra son kireç fraksiyonu. (Guffa'nın cevabına bakınız). Sizin fonksiyonunuz (bir kısmı) bunu yapar . ama% 100 doğru yaşta kireç atmak için nasıl kullanabilirim? DOB nadiren 1/1 / yyyy'de başlar ..... tam yaşınızı kireçlemek için fonunuzu nasıl kullanabilirim?
Royi Namir

10

İşte benim çözümüm, ayrıştırılabilir bir tarihte geç:

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

Alternatif çözüm, çünkü neden olmasın:

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

Yıllar ve günler içinde yaşı bulmak kolay teşekkürler
Sumit Kumar Gupta

5

Doğum gününün zaten geçip geçmediğini test etmek için Date.prototype.getDoY, yılın gün numarasını etkili bir şekilde döndüren bir yardımcı işlev tanımlarım . Gerisi oldukça açıklayıcı.

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

Bu, 28 Şubat'tan sonraki doğum günleri için artık yıllarda yanlış sonuçlar verir. Bu insanları 1 gün yaşlandırır. EG: Dob = için 2001/07/04 , bu fonksiyon üzerine, 7 yıl dönecektir 2008/07/03 .
Brock Adams

@Brock: Teşekkürler. Eğer yanılmıyorsam, bu hatalı davranışı düzelttim.
Marcel Korpel

Evet, bence olabilir (titizlikle test etmediniz, sadece analiz ettiniz). Ancak, yeni çözümün OP'nin çözümünden daha basit ve daha zarif olmadığını unutmayın (bunun bir işlevde düzgün bir şekilde kapsüllendiğini saymamak). ... OP'nin çözümünü anlamak daha kolaydır (böylece denetlemek, test etmek veya değiştirmek). Bazen basit ve anlaşılır en iyisidir, IMO.
Brock Adams

@Brock: Tamamen katılıyorum: Bu işlevin ne yaptığını düşünmem gerekiyor ve bu asla iyi bir şey değil.
Marcel Korpel

"İf (doyNow <doyBirth)" eğer "eğer (doyNow <= doyBirth)" olmamalı mı? Tüm testlerimde, gün bir gün izin verdi ve bu düzeltildi.
Ted Kulp

5

Bence bu böyle olabilir:

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

Zaman damgasıyla da çalışır

age(403501000000)
//34

Bu kod, tüm yıl aynı yaşta olan bir kişiyi hesaplar. Örneğin, bugün '09 / 19/2018 'olsaydı kod 37'yi verirdi, ancak yaş (doğum gününden önceki gün) 36 olurdu ...
Steve Goossens

4

Bu işlevi kendim için yazmak zorunda kaldım - kabul edilen cevap oldukça iyi ama IMO biraz temizlik kullanabilir. Bu benim gereksinimim oldu ama hızlı bir şekilde bir dize kullanmak için adapte edilebilir çünkü dob için bir unix zaman damgası alır:

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 işlevimde 31 değerini kullandım. Tüm hesaplama, "yılın gününün" zaman damgasının monoton olarak artan bir ölçüsü olması yönündedir.

Bir javascript zaman damgası veya dizesi kullanıyorsanız, 1000 faktörünü kaldırmak isteyeceksiniz.


n tanımsız. Sanırım şimdi demek istiyorsun. 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;
}

Avrupa tarihinin girildiği yaşı almak için:

getAge('16-03-1989')

Stackoverflow.com/a/13367162/1055987 adresindeki öneriniz için teşekkür ederiz .
JFK

3

Moment.js ile bir olası çözüm daha :

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

Daha önce gösterilen örnekleri kontrol ettim ve her durumda çalışmadılar ve bu yüzden kendi senaryomu yaptım. Bunu test ettim ve mükemmel çalışıyor.

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 bir yıl mı olmalı? Eğer öyleyse, o zaman yukarıdakiler mükemmel değildir. :-)
RobG

2

Bu benim için en zarif yol:

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 ile doğum tarihinden itibaren yaş (yıl, ay ve gün) alın

İşlev kalcularEdad (yıl, ay ve gün)

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

İşlev 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

Benim için mükemmel çalışıyor çocuklar.

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

0

Bu çok eski bir konu olduğunu biliyorum ama çok daha doğru olduğuna inandığım yaş bulmak için yazdığım bu uygulamada koymak istedim.

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

Tabii bunu parametreleri elde etmenin diğer formatlarına uyacak şekilde uyarlayabilirsiniz. Umarım bu daha iyi bir çözüm arayan birine yardımcı olur.


0

Bu yaklaşımı matematik yerine mantık kullanarak kullandım. Kesin ve hızlı. Parametreler kişinin doğum gününün yılı, ayı ve günüdür. Kişinin yaşını bir tamsayı olarak döndürür.

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


0

Naveen'in ve orijinal OP'nin gönderilerinden benimsediğimde, hem dizeleri hem de JS Date nesnelerini kabul eden yeniden kullanılabilir bir yöntem saplamasıyla sonuçlandım.

İsmi söyledim gregorianAge()çünkü bu hesaplama, Gregoryen takvimini kullanarak yaşı tam olarak nasıl gösterdiğimizi veriyor. Yani ay ve gün doğum yılının ay ve gününden önce ise bitiş yılını saymamak.

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

İki seçenek daha:

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

Bir önceki cevaba güncellenen bazılarını yaptım

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

Umarım yardımcı olur: D


0

İşte yaş hesaplamanın basit bir yolu:

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

Şu an ile doğum yılı arasında basit bir yıl farkı var. Sonra bugün doğum gününden daha erken ise bir yıl çıkarır (düşünün, yaşınız yıl boyunca doğum
Steve Goossens

0

Bunu formunuzdaki yaş sınırlaması için kullanabilirsiniz -

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

Biraz geç kaldım ama bunu doğum tarihini hesaplamanın en basit yolu olarak buldum.

$(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 etiketi:

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

Umarım bu yardımcı olacaktır.


-1

İşte bulabileceğim en basit, en doğru çözüm:

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

Ve burada bir yıl 29 Şubat - 28 Şubat dikkate alacak bir örnek.

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

Negatif yaşla bile çalışır!


Diğerleri gibi, 2000-02-29 ile 2001-02-28'in sıfır yıl olduğunu düşünüyor.
RobG

Artık yıl sonunu karşılamak için cevabımı güncelledim. Teşekkürler @RobG
wizulus

-1

Yine başka bir çözüm:

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

İle momentjs "fromNow" yöntemiyle, bu biçimlendirilmiş tarih, yani çalışmak yapmanızı sağlar: 1968/03/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";

Prototip versiyonu olarak

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

}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.