Oblicz wiek na podstawie daty urodzenia w formacie RRRRMMDD

285

Jak obliczyć wiek w latach, biorąc pod uwagę datę urodzenia w formacie RRRRMMDD? Czy jest możliwe użycie tej Date()funkcji?

Szukam lepszego rozwiązania niż to, którego używam teraz:

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

Franciszek
źródło
Pamiętaj o swoim formatowaniu, nie rób tego tak, jak zrobiłeś; wystarczy wciąć kod za pomocą 4 spacji, używając przycisku kodu (010101) lub Ctrl-K.
Marcel Korpel
Zrobiłem to, ale nie działa na IE9 Beta, więc musiałem to zrobić ręcznie.
Francisc
4
Twoje oryginalne rozwiązanie jest lepsze przy obliczaniu wieku niż obecne odpowiedzi. Odpowiedź Júlio Santosa jest zasadniczo taka sama. Inne odpowiedzi dają niedokładne wyniki w wielu warunkach i mogą być mniej proste lub mniej skuteczne.
Brock Adams,
Dziękuję Brock. Miałem nadzieję, że istnieje bardziej elegancki sposób na zrobienie tego niż to, co wydaje się nieco prymitywne.
Francisc
4
@Francisc, jest prymitywny, ale to właśnie Datemusiałby zrobić obiekt, gdyby go zamknął. Ludzie mogli pisać książki o tym, jak JS zachowuje się podstępnie Date. ... Jeśli możesz żyć z czasem nieobecności w ciągu dnia, przybliżenie: AgeInYears = Math.floor ( (now_Date - DOB_Date) / 31556952000 )jest tak proste, jak to tylko możliwe.
Brock Adams,

Odpowiedzi:

245

Chciałbym uzyskać czytelność:

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

Oświadczenie: Ma to również problemy z precyzją, więc nie można w pełni zaufać. Może być wyłączony o kilka godzin, na kilka lat lub w czasie letnim (w zależności od strefy czasowej).

Zamiast tego poleciłbym do tego bibliotekę, jeśli precyzja jest bardzo ważna. Jest również @Naveens postprawdopodobnie najdokładniejszy, ponieważ nie zależy od pory dnia.


Punkty odniesienia: http://jsperf.com/birthday-calculation/15

André Snede Kock
źródło
3
Zwraca 0 lat dla dat takich jak 2000-02-29 do 2001-02-28, kiedy prawdopodobnie powinien zwrócić 1.
RobG
16
@RobG Nie sądzę, żeby technicznie upłynął cały rok od 2000-02-29 do 2001-02-28, przez co twoja odpowiedź jest nieprawidłowa. To nie miałoby sensu, 2000-02-28 do 2001-02-28 to rok, więc 2000-02-29 do 2001-02-28 muszą być krótsze niż rok.
André Snede Kock
3
Nie zastanawiałeś się, co znaczy „nieprecyzyjny”, pomyślałem, że dodatkowe informacje mogą być pomocne. Możesz rozważyć rozwiązanie problemów lub usunięcie odpowiedzi.
RobG
1
@RobG Właściwie to zrobiłem. Wskazałem również na lepsze rozwiązanie niż moje własne. Moje rozwiązanie rozwiązuje problem w sposób łatwy do odczytania, z drobnymi problemami z precyzją, ale w granicach celu.
André Snede Kock
1
Cudowna odpowiedź @ AndréSnedeHansen i szybka, ponieważ nie masz takiego szalonego podziału, jaki jest obecny w mojej odpowiedzi ;-) +1 za czytelność i szybkość.
Kristoffer Dorph,
506

Spróbuj tego.

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

Uważam, że jedyną rzeczą, która wyglądała prymitywnie w twoim kodzie, była substr część.

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

naveen
źródło
Czy możesz podać przykład użycia? Nie mogłem go uruchomić bez modyfikacji funkcji w celu pobrania 3 oddzielnych argumentów, takich jak: getAge (y, m, d). Na przykład: jsbin.com/ehaqiw/1/edit
edt
Podobnie jak wiele innych, uważa, że ​​od 2000-02-29 do 2001-02-28 to zero lat, kiedy najprawdopodobniej powinien to być 1 (od 2001-03-01 powinien to być 1 rok 1 dzień).
RobG
3
@RobG: kiedy skaczące „świętują” (powszechna odpowiedź na to pytanie wydaje się tak naprawdę: „weekend najbliższy rzeczywistej daty”), ich dzień urodzenia różni się w zależności od kontekstu obejmującego: region geograficzny (prosty angielski: gdzie mieszkasz ), PRAWO (nie lekceważ tego), religia i preferencje osobiste (w tym zachowanie grupowe): Niektóre przyczyny: „Urodziłem się w lutym”, inne powody: „Urodziłem się następnego dnia po 28 lutego” (najczęściej 1 marca) en.wikipedia.org/wiki/Luty_29 Wszystkie powyższe algo jest poprawne JEŻELI 1 marca to wynik leapyear, którego potrzebujesz
GitaarLAB
3
@RobG: Szambo „plus x miesiąc (y)” nie ma znaczenia dla ludzkiego pojęcia wieku w latach. Powszechnie uważa się, że licznik wieku (InYears) rośnie każdego dnia (bez względu na czas), kiedy kalendarz ma ten sam miesiąc # i dzień # (w porównaniu z datą początkową): tak, że 2000-02-28 do 2001-02 -27 = 0 lat, a 2000-02-28 do 2001-02-28 = 1 rok. Rozszerzenie tego „zdrowego rozsądku” na skoki: 2000-02-29 (dzień po 2000-02-28) do 28.02.2001 = zero lat . Mój komentarz stwierdził jedynie, że odpowiedź na algo zawsze daje „poprawną” ludzką odpowiedź, JEŻELI oczekuje się / zgadza się z tą logiką w przypadku skoku.
GitaarLAB,
3
@RobG: Nigdy nie powiedziałem, że ja lub odpowiedź była ogólnie poprawna (TM). Zawarłem pojęcie kontekstów / jurysdykcji / poglądów. Oba moje komentarze wyraźnie zawierają wielką literę IF (w odniesieniu do obsługi skoków wyjątków). W rzeczywistości mój pierwszy komentarz precyzował dokładnie to, co chciałem powiedzieć, i nigdy nie zawierał żadnego osądu dotyczącego dobra lub zła. W efekcie moje komentarze wyjaśniają, czego i czego nie należy oczekiwać (i dlaczego) od tej odpowiedzi (jak to nazywacie „podkreśl problemy”). Ps: 31 lutego?!?
GitaarLAB,
72

Ważne: ta odpowiedź nie zapewnia 100% dokładnej odpowiedzi, jest wyłączona o około 10-20 godzin w zależności od daty.

Nie ma lepszych rozwiązań (w każdym razie nie w tych odpowiedziach). - naveen

Oczywiście nie mogłem się oprzeć pokusie podjęcia wyzwania i stworzenia szybszego i krótszego kalkulatora urodzinowego niż obecnie akceptowane rozwiązanie. Głównym punktem mojego rozwiązania jest to, że matematyka jest szybka, więc zamiast korzystać z rozgałęzień, a javascript modelu daty zapewnia obliczenie rozwiązania, używamy wspaniałej matematyki

Odpowiedź wygląda tak i działa około 65% szybciej niż naveen, a ponadto jest znacznie krótsza:

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

Magiczna liczba: 31557600000 to 24 * 3600 * 365.25 * 1000, czyli długość roku, długość roku to 365 dni i 6 godzin, czyli 0,25 dnia. Na koniec przedstawiam wynik, który daje nam końcowy wiek.

Oto kryteria: http://jsperf.com/birthday-calculation

Aby wesprzeć format danych OP, możesz go wymienić +new Date(dateString);
z+new Date(d.substr(0, 4), d.substr(4, 2)-1, d.substr(6, 2));

Jeśli możesz znaleźć lepsze rozwiązanie, udostępnij je! :-)

Kristoffer Dorph
źródło
To całkiem fajne rozwiązanie. Jedyny problem, jaki z nim widzę, to odpowiedni dateStringargument, aby konstruktor Date () mógł go poprawnie przeanalizować. Na przykład biorąc YYYYMMDDformat podany w pytaniu, to się nie powiedzie.
Francisc
22
Ta odpowiedź zawiera błąd. Ustaw zegar na 12:01. O godzinie 01:01, jeśli wyliczysz (27.03.2012) (dzisiejsza data), otrzymasz odpowiedź zero, mimo że powinna ona wynosić 1. Ten błąd występuje przez całą godzinę 00:00. Wynika to z niepoprawnego stwierdzenia, że ​​rok ma 365.25 dni. To nie. Mamy do czynienia z latami kalendarzowymi, a nie z długością orbity Ziemi (która dokładniej wynosi 365.256363 dni). Rok ma 365 dni, z wyjątkiem roku przestępnego, który ma 366 dni. Poza tym wydajność na czymś takim jest bez znaczenia. Utrzymanie jest znacznie ważniejsze.
Eric Brandel
1
Dzięki za twoje rozwiązanie Kristoffer. Czy mogę zapytać, co + nowy robi w porównaniu do nowego, a także dwie tyldy (~) w zamian?
Frank Jensen
1
@FrankJensen Cześć Frank, byłem również ciekawy i znalazłem tę odpowiedź: podwójna tyldy przekształca liczbę zmiennoprzecinkową na liczbę całkowitą Pozdrowienia
Stano
1
@FrankJensen zasadniczo tylda odwraca liczbę (wartość binarna), konwertując liczbę zmiennoprzecinkową na liczbę całkowitą (zmiennoprzecinkową), stąd dwie tylda dają zaokrągloną liczbę. Znak + przed nową datą () konwertuje obiekt na całkowitą reprezentację obiektu daty, można go również używać z ciągami liczb, na przykład + '21 '=== 21
Kristoffer Dorph
55

Z momentjs:

/* The difference, in years, between NOW and 2012-05-07 */
moment().diff(moment('20120507', 'YYYYMMDD'), 'years')
Vitor Tyburski
źródło
2
@RicardoPontual wymaga to momentjs, więc nie może być najlepszą odpowiedzią.
itzmukeshy7
13
@ itzmukeshy7 rzeczywiście, aby odpowiedź była najlepsza, powinna przynajmniej wymagać jQuery;)
thomaux
@thomaux Zależy to całkowicie od środowiska programistycznego!
itzmukeshy7
@ itzmukeshy7 relaks, to żart;) patrz: meta.stackexchange.com/a/19492/173875
thomaux
2
@ thomaux Wiedziałem, że to żart;)
itzmukeshy7
38

Oczyść jedno-liniowe rozwiązanie za pomocą 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

Używam roku 365,25 dni (0,25 z powodu lat przestępnych), które wynoszą odpowiednio 3,15576e + 10 milisekund (365,25 * 24 * 60 * 60 * 1000).

Lucas Janon
źródło
1
Całkiem cholernie schludnie - czy mógłbyś wyjaśnić, co oznacza wersja 3.15576e + 10?
leonheess
1
Tak, dobrze byłoby dodać następujący wiersz przed funkcją:const yearInMs = 3.15576e+10 // Using a year of 365.25 days (because leap years)
Lucas Janon
12

Jakiś czas temu stworzyłem funkcję w tym celu:

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

Przyjmuje obiekt Date jako dane wejściowe, dlatego należy przeanalizować 'YYYYMMDD'sformatowany ciąg daty:

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
źródło
Ach tak, przegapiłem rok przestępny. Dziękuję Ci.
Francisc
1
Daje to nieprawidłowe wartości dla wybranych kombinacji dat! Na przykład, jeśli birthDatejest to 5 stycznia 1980 r. , A bieżącą datą jest 4 stycznia 2005 r. , Wówczas funkcja będzie błędnie zgłaszać agejako 25 ... Prawidłowa wartość to 24.
Brock Adams
@BrockAdams Dlaczego tak jest? W tej chwili mam ten problem. Dzięki.
Jack H
@VisionIncision, ponieważ nie obsługuje poprawnie warunków krawędzi. Wierzcie lub nie, kod z pytania jest najlepszym podejściem - choć wygląda na to, że jedna z późniejszych odpowiedzi mogła go odpowiednio zapakować.
Brock Adams,
CMS Cześć :-) Napisałem to pytanie ( stackoverflow.com/questions/16435981/... ) i powiedziano mi, że jeśli chcę 100% dokładnej odpowiedzi, powinienem sprawdzać co roku - jeśli jest to rok przestępny, a następnie oblicz ostatni frakcja. (patrz odpowiedź Guffa). Twoja funkcja (jej część) robi to . ale jak mogę go użyć, aby obliczyć wiek w 100% dokładny? DOB rzadko zaczyna się od 1/1 / rrrr ..... więc jak mogę użyć twojego func do obliczenia dokładnego wieku?
Royi Namir
10

Oto moje rozwiązanie, podaj datę, którą można przeanalizować:

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
źródło
7

Alternatywne rozwiązanie, ponieważ dlaczego nie:

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
źródło
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
źródło
Dzięki łatwo znaleźć wiek w latach miesiącach i dniach
Sumit Kumar Gupta
5

Aby sprawdzić, czy urodziny już minęły, definiuję funkcję pomocnika Date.prototype.getDoY, która skutecznie zwraca numer dnia w roku. Reszta jest dość oczywista.

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
źródło
Daje to niedokładne wyniki w latach przestępnych, w przypadku urodzin po 28 lutego. Starzeje takich ludzi o 1 dzień. EG: dla DoB = 2001/07/04 funkcja ta powróci o 7 lat, w dniu 2008/07/03 .
Brock Adams,
@Brock: Dzięki. Jeśli się nie mylę, poprawiłem to błędne zachowanie.
Marcel Korpel,
Tak, myślę, że mogłeś (nie poddałeś się rygorystycznym testom, tylko przeanalizowałem). Zauważ jednak, że nowe rozwiązanie nie jest prostsze i nie jest bardziej eleganckie niż rozwiązanie OP (nie licząc, że to jest odpowiednio zamknięte w funkcji). ... Rozwiązanie OP jest łatwiejsze do zrozumienia (a więc do audytu, testowania lub modyfikacji). Czasami najlepsza jest prosta, bezpośrednia IMO.
Brock Adams,
@Brock: W pełni się zgadzam: muszę pomyśleć o tym, co robi ta funkcja, i to nigdy nie jest dobre.
Marcel Korpel
Czy „if (doyNow <doyBirth)” nie powinno być „if (doyNow <= doyBirth)”? We wszystkich moich testach dzień był wolny o jeden i to naprawiło.
Ted Kulp,
5

Myślę, że tak może być po prostu:

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

Działa również ze znacznikiem czasu

age(403501000000)
//34
romuleald
źródło
Ten kod obliczy osobę w tym samym wieku przez cały rok. W twoim przykładzie, gdyby dzisiaj był „09/19/2018”, kod dałby 37, ale wiek (dzień przed urodzinami) wyniósłby 36 ...
Steve Goossens
4

Musiałem po prostu napisać tę funkcję dla siebie - zaakceptowana odpowiedź jest dość dobra, ale IMO może użyć trochę porządków. Wymaga to na czas uniksowego znacznika czasu, ponieważ było to moje wymaganie, ale można je szybko dostosować do użycia ciągu:

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

Zauważ, że użyłem płaskiej wartości 31 w mojej funkcji MeasureDays. W obliczeniach chodzi tylko o to, aby „dzień roku” był monotonicznie rosnącą miarą znacznika czasu.

Jeśli używasz znacznika czasu lub ciągu javascript, oczywiście będziesz chciał usunąć współczynnik 1000.

Keith Nordstrom
źródło
n jest niezdefiniowany. Myślę, że masz na myśli now.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;
}

Aby uzyskać wiek, w którym rozpoczęła się data europejska:

getAge('16-03-1989')
Martijn van Hoof
źródło
Dzięki za sugestię na stackoverflow.com/a/13367162/1055987 dobry haczyk.
JFK,
3

Jeszcze jedno możliwe rozwiązanie z 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
źródło
2

Sprawdziłem wcześniej pokazane przykłady i nie zadziałały we wszystkich przypadkach, dlatego stworzyłem własny skrypt. Przetestowałem to i działa idealnie.

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
źródło
Czy 2000-02-29 do 2001-02-28 powinien trwać rok? Jeśli tak, to powyższe nie jest idealne. :-)
RobG
2

To dla mnie najbardziej elegancki sposób:

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
źródło
1

Uzyskaj wiek (lata, miesiące i dni) od daty urodzenia za pomocą javascript

Funkcja calcularEdad (lata, miesiące i dni)

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

Funkcja 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
źródło
1

Działa idealnie dla mnie.

getAge(birthday) {
    const millis = Date.now() - Date.parse(birthday);
    return new Date(millis).getFullYear() - 1970;
}
20 fps
źródło
0

Wiem, że jest to bardzo stary wątek, ale chciałem wprowadzić tę implementację, którą napisałem, aby znaleźć wiek, który moim zdaniem jest znacznie dokładniejszy.

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

Oczywiście można to dostosować do innych formatów uzyskiwania parametrów. Mam nadzieję, że to pomoże komuś, kto szuka lepszego rozwiązania.

ganaraj
źródło
0

Użyłem tego podejścia, używając logiki zamiast matematyki. Jest precyzyjny i szybki. Parametry to rok, miesiąc i dzień urodzin osoby. Zwraca wiek osoby jako liczbę całkowitą.

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
źródło
łańcuchy lub obiekty daty do wprowadzania według OP
nazim
0

Wychodząc z postów naveen i oryginalnych OP, otrzymałem kod wielokrotnego użytku, który akceptuje zarówno łańcuchy, jak i obiekty JS Date.

Nazwałem go, gregorianAge()ponieważ obliczenia te pokazują dokładnie, w jaki sposób określamy wiek za pomocą kalendarza gregoriańskiego. tzn. nie liczenie roku końcowego, jeśli miesiąc i dzień przypada przed miesiącem i dniem roku urodzenia.

/**
 * 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
źródło
0

Dwie dodatkowe opcje:

// 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
źródło
0

Zrobiłem kilka aktualizacji do jednej poprzedniej odpowiedzi.

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

Mam nadzieję, że to pomoże: D

Fabricio
źródło
0

oto prosty sposób obliczania wieku:

//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
źródło
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
źródło
Czyni to prostą różnicę roku między teraz a rokiem urodzenia. Następnie odejmuje rok jeśli dzisiaj jest wcześniej niż w roku urodzin (pomyśl o tym, twój wiek idzie w górę w ciągu roku, na urodziny)
Steve Goossens
0

Możesz użyć tego do ograniczenia wieku w swojej formie -

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
źródło
0

Jestem trochę za późno, ale uznałem, że jest to najprostszy sposób na obliczenie daty urodzenia.

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

Mam nadzieję, że to pomoże.

TWDbag
źródło
-1

Oto najprostsze, najdokładniejsze rozwiązanie, jakie mogłem wymyślić:

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

A oto próbka, która weźmie pod uwagę 29 lutego -> 28 lutego rocznie.

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

Działa nawet z ujemnym wiekiem!

wizulus
źródło
Podobnie jak wszystkie inne, uważa, że ​​2000-02-29 do 2001-02-28 to zero lat.
RobG
Zaktualizowałem swoją odpowiedź, aby uwzględnić przypadek roku przestępnego. Dzięki @RobG
wizulus
-1

Jeszcze inne rozwiązanie:

/**
 * 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
źródło
-1

Dzięki metodzie momentjs „fromNow” pozwala to na pracę ze sformatowaną datą, tj .: 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";

Jako wersja prototypowa

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

}

Nicolas Giszpenc
źródło