Berechnen Sie das Alter anhand des Geburtsdatums im Format JJJJMMTT

285

Wie kann ich ein Alter in Jahren bei einem Geburtsdatum im Format JJJJMMTT berechnen? Ist es möglich mit der Date()Funktion?

Ich suche nach einer besseren Lösung als der, die ich jetzt verwende:

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
quelle
Bitte achten Sie auf Ihre Formatierung, machen Sie es nicht so, wie Sie es getan haben; Ziehen Sie Ihren Code einfach mit der Code-Taste (010101) oder Strg-K mit 4 Leerzeichen ein.
Marcel Korpel
Ich habe es getan, aber es funktioniert nicht mit IE9 Beta, also musste ich es von Hand machen.
Francisc
4
Ihre ursprüngliche Lösung ist bei der Berechnung des Alters besser als die aktuellen Antworten. Die Antwort von Júlio Santos ist im Wesentlichen dasselbe. Die anderen Antworten liefern unter vielen Bedingungen ungenaue Ergebnisse und sind möglicherweise weniger einfach oder weniger effizient.
Brock Adams
Danke Brock. Ich hatte gehofft, dass es einen eleganteren Weg gibt, als den, der ein bisschen grob erscheint.
Francisc
4
@Francisc, es ist grob, aber es ist das, was das DateObjekt tun müsste, wenn es es einkapseln würde. Die Leute könnten Bücher über die Dummheit des Umgangs mit JS schreiben Date. ... Wenn Sie damit leben können, dass Sie manchmal einen Tag frei haben, dann ist die Annäherung: AgeInYears = Math.floor ( (now_Date - DOB_Date) / 31556952000 )so einfach wie möglich.
Brock Adams

Antworten:

245

Ich würde mich um Lesbarkeit bemühen:

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

Haftungsausschluss: Dies hat auch Präzisionsprobleme, sodass auch diesem nicht vollständig vertraut werden kann. Es kann einige Stunden, einige Jahre oder während der Sommerzeit (abhängig von der Zeitzone) ausgeschaltet sein.

Stattdessen würde ich empfehlen, dafür eine Bibliothek zu verwenden, wenn Präzision sehr wichtig ist. Auch @Naveens postist wahrscheinlich die genaueste, da es nicht von der Tageszeit abhängt.


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

André Snede Kock
quelle
3
Dies gibt 0 Jahre für Daten wie 2000-02-29 bis 2001-02-28 zurück, wenn es wahrscheinlich 1 zurückgeben sollte.
RobG
16
@RobG Ich glaube nicht, dass technisch ein ganzes Jahr vom 29.02.2000 bis zum 28.02.2001 vergangen ist, was Ihre Antwort ungültig macht. Es würde keinen Sinn machen, 2000-02-28 bis 2001-02-28 ist ein Jahr, also muss 2000-02-29 bis 2001-02-28 weniger als ein Jahr sein.
André Snede Kock
3
Sie haben nicht näher erläutert, was "nicht genau" bedeutet. Ich dachte, zusätzliche Informationen könnten hilfreich sein. Sie können die Probleme beheben oder die Antwort löschen.
RobG
1
@RobG Eigentlich habe ich. Ich wies auch auf eine bessere Lösung als meine eigene hin. Meine Lösung löst das Problem auf leicht lesbare Weise mit geringfügigen Präzisionsproblemen, jedoch im Rahmen seines Zwecks.
André Snede Kock
1
Schöne Antwort @ AndréSnedeHansen und auch schnell, da Sie nicht diese verrückte Unterteilung haben, wie sie in meiner Antwort vorhanden ist ;-) +1 für Lesbarkeit und Geschwindigkeit.
Kristoffer Dorph
506

Versuche dies.

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

Ich glaube, das einzige, was auf Ihrem Code grob aussah, war der substrTeil.

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

Naveen
quelle
Können Sie ein Anwendungsbeispiel geben? Ich konnte es nicht zum Laufen bringen, ohne die Funktion so zu ändern, dass drei separate Argumente verwendet werden, z. B.: GetAge (y, m, d). Zum Beispiel: jsbin.com/ehaqiw/1/edit
edt
Wie viele andere glaubt dies, dass 2000-02-29 bis 2001-02-28 null Jahre sind, wenn es höchstwahrscheinlich 1 sein sollte (da bis 2001-03-01 1 Jahr 1 Tag sein sollte).
RobG
3
@RobG: wenn leaplings ‚feiern‘ (die gemeinsame Antwort auf diese Frage nur scheint tatsächlich zu sein: ‚das Wochenende am nächsten an der tatsächlichen Datum‘) ihre Geburts Tag unterscheidet sich basierend auf Kontext einschließlich: geographische Region (einfaches Englisch: wo Sie leben ), GESETZ (unterschätze das nicht), Religion und persönliche Vorlieben (einschließlich Gruppenverhalten): Ein Grund: "Ich bin im Februar geboren", andere Grund: "Ich bin einen Tag nach dem 28. Februar geboren" (das ist am häufigsten der 1. März) en.wikipedia.org/wiki/February_29 Für all das oben Genannte ist dieses Algo korrekt, WENN der 1. März das Leapyear-Ergebnis ist, das man braucht
GitaarLAB
3
@RobG: Die Senkgrube von 'plus x Monat (en)' ist für die menschliche Vorstellung vom Alter in Jahren irrelevant. Die gängige menschliche Vorstellung ist, dass der Alterszähler (InYears) jeden Tag (ohne Berücksichtigung der Zeit) zunimmt, wenn der Kalender dieselbe Monats- und Tagnummer (im Vergleich zum Startdatum) hat: so dass 2000-02-28 bis 2001-02 -27 = 0 Jahre und 2000-02-28 bis 2001-02-28 = 1 Jahr. Ausweitung dieses „gesunden Menschenverstandes“ auf Sprünge: 2000-02-29 (am Tag nach 2000-02-28) bis 2001-02-28 = null Jahre . In meinem Kommentar wurde lediglich festgestellt, dass das beantwortete Algo immer die "richtige" menschliche Antwort gibt, wenn man diese Logik für Sprünge erwartet / akzeptiert.
GitaarLAB
3
@RobG: Ich habe nie gesagt, dass ich oder die Antwort allgemein korrekt ist (TM). Ich habe die Vorstellung von Kontexten / Gerichtsbarkeiten / Ansichten aufgenommen. Meine beiden Kommentare enthalten eindeutig eine IF in Großbuchstaben (zur Behandlung der Ausnahmesprünge). Tatsächlich gab mein erster Kommentar genau an, was ich sagen wollte, und enthielt niemals ein Urteil über richtig oder falsch. In der Tat klären meine Kommentare, was und was nicht (und warum) von dieser Antwort zu erwarten ist (wie Sie es nennen "Hervorheben der Probleme"). Ps: 31. Februar?!?
GitaarLAB
72

Wichtig: Diese Antwort liefert keine 100% genaue Antwort, sie ist je nach Datum um ca. 10-20 Stunden verschoben.

Es gibt keine besseren Lösungen (in diesen Antworten sowieso nicht). - Naveen

Ich konnte natürlich dem Drang nicht widerstehen, die Herausforderung anzunehmen und einen schnelleren und kürzeren Geburtstagsrechner als die derzeit akzeptierte Lösung zu erstellen. Der Hauptpunkt für meine Lösung ist, dass Mathematik schnell ist. Statt Verzweigung zu verwenden und das Datumsmodell Javascript zur Berechnung einer Lösung zu verwenden, verwenden wir die wunderbare Mathematik

Die Antwort sieht so aus und läuft ~ 65% schneller als die von Naveen und ist viel kürzer:

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

Die magische Zahl: 31557600000 ist 24 * 3600 * 365,25 * 1000. Dies ist die Länge eines Jahres, die Länge eines Jahres beträgt 365 Tage und 6 Stunden, was 0,25 Tagen entspricht. Am Ende habe ich das Ergebnis, das uns das endgültige Alter gibt.

Hier sind die Benchmarks: http://jsperf.com/birthday-calculation

OPs Datenformat unterstützen Sie ersetzen können +new Date(dateString);
mit+new Date(d.substr(0, 4), d.substr(4, 2)-1, d.substr(6, 2));

Wenn Sie eine bessere Lösung finden können, teilen Sie diese bitte mit! :-)

Kristoffer Dorph
quelle
Das ist eine ziemlich coole Lösung. Das einzige Problem, das ich dabei sehe, ist das dateStringArgument, dass der Date () - Konstruktor genau richtig ist, um es korrekt zu analysieren. Wenn Sie beispielsweise das YYYYMMDDFormat verwenden, das ich in der Frage angegeben habe, schlägt dies fehl.
Francisc
22
Diese Antwort hat einen Fehler. Stellen Sie Ihre Uhr auf 00:01 Uhr ein. Wenn Sie um 00:01 Uhr ('2012-03-27') (heutiges Datum) berechnen, erhalten Sie eine Antwort von Null, obwohl sie gleich 1 sein sollte. Dieser Fehler besteht für die gesamte Stunde um 12:00 Uhr. Dies liegt an der falschen Aussage, dass ein Jahr 365,25 Tage enthält. Es tut nicht. Wir haben es mit Kalenderjahren zu tun, nicht mit der Länge der Erdumlaufbahn (genauer gesagt 365,256363 Tage). Ein Jahr hat 365 Tage, mit Ausnahme eines Schaltjahres mit 366 Tagen. Außerdem ist die Leistung bei so etwas bedeutungslos. Die Wartbarkeit ist weitaus wichtiger.
Eric Brandel
1
Danke für deine Lösung Kristoffer. Kann ich fragen, was das + new im Vergleich zu nur new macht und auch die beiden Tilde's (~) in der Rückgabe?
Frank Jensen
1
@ FrankJensen Hallo Frank, ich war auch neugierig und fand diese Antwort: Double Tilde konvertiert Float in Integer Greetings
Stano
1
@FrankJensen Im Wesentlichen invertiert die Tilde die Zahl (den Binärwert), während Float in eine Ganzzahl (Floored) konvertiert wird. Daher erhalten Sie mit zwei Tilde die gerundete Zahl. Das + vor new Date () konvertiert das Objekt in die ganzzahlige Darstellung des Datumsobjekts. Dies kann auch mit Zahlenfolgen verwendet werden, z. B. + '21 '=== 21
Kristoffer Dorph
55

Mit momentjs:

/* The difference, in years, between NOW and 2012-05-07 */
moment().diff(moment('20120507', 'YYYYMMDD'), 'years')
Vitor Tyburski
quelle
2
@ RicardoPontual dies erfordert momentjs, kann also nicht die beste Antwort sein.
Itzmukeshy7
13
@ itzmukeshy7 in der Tat, damit eine Antwort die beste ist, sollte es mindestens jQuery erfordern;)
thomaux
@thomaux Es kommt ganz auf die Entwicklungsumgebung an!
Itzmukeshy7
@ itzmukeshy7 entspannen, es ist ein Witz;) siehe: meta.stackexchange.com/a/19492/173875
thomaux
2
@ Thomaux Ich wusste, dass es ein Witz ist;)
itzmukeshy7
38

Reinigen Sie die Einzeilerlösung mit 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

Ich verwende ein Jahr von 365,25 Tagen (0,25 aufgrund von Schaltjahren), was 3,15576e + 10 Millisekunden (365,25 * 24 * 60 * 60 * 1000) entspricht.

Lucas Janon
quelle
1
Ziemlich verdammt ordentlich - können Sie näher erläutern, was der 3.15576e + 10 bedeutet?
Leonheess
1
Ja, es wäre gut, die folgende Zeile vor der Funktion hinzuzufügen:const yearInMs = 3.15576e+10 // Using a year of 365.25 days (because leap years)
Lucas Janon
12

Vor einiger Zeit habe ich eine Funktion mit diesem Zweck gemacht:

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

Es wird ein Datumsobjekt als Eingabe verwendet, daher müssen Sie die 'YYYYMMDD'formatierte Datumszeichenfolge analysieren :

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
quelle
Ah ja, ich habe das Schaltjahr verpasst. Danke dir.
Francisc
1
Dies ergibt ungültige Werte für ausgewählte Datumskombinationen! Zum Beispiel, wenn die birthDateist 5. Januar 1980 , und das aktuelle Datum 4. Januar 2005 , dann wird die Funktion fälschlicherweise berichtet ageals 25 ... Der richtige Wert ist 24.
Brock Adams
@BrockAdams Warum ist das so? Ich habe dieses Problem im Moment. Vielen Dank.
Jack H
@VisionIncision, da die Randbedingungen nicht richtig behandelt werden. Ob Sie es glauben oder nicht, der Code aus der Frage ist der beste Ansatz - obwohl es so aussieht, als hätte eine der späteren Antworten ihn geeigneter umgepackt.
Brock Adams
CMS Hi :-) Ich habe diese Frage geschrieben ( stackoverflow.com/questions/16435981/… ) und mir wurde gesagt, wenn ich eine 100% genaue Antwort will, sollte ich jedes Jahr überprüfen - ob es ein Schaltjahr ist, und dann das letzte berechnen Fraktion. (Siehe Guffas Antwort). Ihre Funktion (ein Teil davon) macht das . Aber wie kann ich damit das Alter zu 100% genau berechnen? Das Geburtsdatum beginnt selten bei 1/1 / JJJJ ..... Wie kann ich Ihre Funktion verwenden, um das genaue Alter zu berechnen?
Royi Namir
10

Hier ist meine Lösung, geben Sie einfach ein analysierbares Datum ein:

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
}
Kinergie
quelle
7

Alternative Lösung, denn warum nicht:

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
quelle
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
quelle
Dank leicht zu finden Alter in Jahren Monaten und Tagen
Sumit Kumar Gupta
5

Um zu testen, ob der Geburtstag bereits vergangen ist oder nicht, definiere ich eine Hilfsfunktion Date.prototype.getDoY, die effektiv die Tagesnummer des Jahres zurückgibt. Der Rest ist ziemlich selbsterklärend.

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
quelle
Dies führt zu ungenauen Ergebnissen in Schaltjahren für Geburtstage nach dem 28. Februar. Es altert solche Menschen um 1 Tag. EG: Für DoB = 2001/07/04 wird diese Funktion am 2008/07/03 7 Jahre zurückgegeben .
Brock Adams
@Brock: Danke. Wenn ich mich nicht irre, habe ich dieses fehlerhafte Verhalten korrigiert.
Marcel Korpel
Ja, ich denke, Sie haben es vielleicht getan (nicht streng getestet, nur analysiert). Beachten Sie jedoch, dass die neue Lösung nicht einfacher und eleganter ist als die Lösung des OP (ohne zu berücksichtigen, dass diese Lösung ordnungsgemäß in einer Funktion gekapselt ist). ... Die Lösung des OP ist leichter zu verstehen (also zu prüfen, zu testen oder zu modifizieren). Manchmal ist einfach und unkompliziert das Beste, IMO.
Brock Adams
@Brock: Ich stimme voll und ganz zu: Ich muss darüber nachdenken, was diese Funktion macht und das ist nie gut.
Marcel Korpel
Sollte "if (doyNow <doyBirth)" nicht "if (doyNow <= doyBirth)" sein? In all meinen Tests war der Tag um eins vorbei und das hat es behoben.
Ted Kulp
5

Ich denke das könnte einfach so sein:

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

Funktioniert auch mit einem Zeitstempel

age(403501000000)
//34
romuleald
quelle
Dieser Code berechnet eine Person, die das ganze Jahr über das gleiche Alter hat. Wenn in Ihrem Beispiel heute '09 / 19/2018 'wäre, würde der Code 37 geben, aber das Alter (am Tag vor dem Geburtstag) wäre 36 ...
Steve Goossens
4

Ich musste diese Funktion nur für mich selbst schreiben - die akzeptierte Antwort ist ziemlich gut, aber IMO könnte eine Bereinigung gebrauchen. Dies erfordert einen Unix-Zeitstempel für dob, da dies meine Anforderung war, aber schnell an die Verwendung eines Strings angepasst werden konnte:

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

Beachten Sie, dass ich in meiner MeasureDays-Funktion einen flachen Wert von 31 verwendet habe. Bei der Berechnung geht es nur darum, dass der "Tag des Jahres" ein monoton ansteigendes Maß für den Zeitstempel ist.

Wenn Sie einen Javascript-Zeitstempel oder eine Zeichenfolge verwenden, sollten Sie natürlich den Faktor 1000 entfernen.

Keith Nordstrom
quelle
n ist undefiniert. Ich denke du meinst jetzt.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;
}

So ermitteln Sie das Alter, in dem das europäische Datum eingegeben wurde:

getAge('16-03-1989')
Martijn van Hoof
quelle
Vielen Dank für Ihren Vorschlag unter stackoverflow.com/a/13367162/1055987 guter Fang.
JFK
3

Eine weitere mögliche Lösung mit 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
quelle
2

Ich habe die zuvor gezeigten Beispiele überprüft und sie haben nicht in allen Fällen funktioniert. Aus diesem Grund habe ich ein eigenes Skript erstellt. Ich habe das getestet und es funktioniert perfekt.

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
quelle
Sollte der 29.02.2000 bis der 28.02.2001 ein Jahr sein? Wenn ja, dann ist das oben genannte nicht perfekt. :-)
RobG
2

Das ist der eleganteste Weg für mich:

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
quelle
1

Holen Sie sich das Alter (Jahre, Monate und Tage) ab dem Geburtsdatum mit Javascript

Funktion calcularEdad (Jahre, Monate und Tage)

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

Funktion 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
quelle
1

Funktioniert perfekt für mich, Jungs.

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

Ich weiß, dass dies ein sehr alter Thread ist, aber ich wollte diese Implementierung einfügen, die ich geschrieben habe, um das Alter zu finden, von dem ich glaube, dass es viel genauer ist.

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

Natürlich können Sie dies anpassen, um es in andere Formate zum Abrufen der Parameter zu passen. Ich hoffe, dies hilft jemandem, der nach einer besseren Lösung sucht.

Ganaraj
quelle
0

Ich habe diesen Ansatz mit Logik anstelle von Mathematik verwendet. Es ist präzise und schnell. Die Parameter sind das Jahr, der Monat und der Tag des Geburtstages der Person. Es gibt das Alter der Person als Ganzzahl zurück.

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
quelle
Zeichenfolgen oder
Datumsobjekte
0

Als ich die Beiträge von Naveen und Original OP übernahm, erhielt ich einen wiederverwendbaren Methodenstub, der sowohl Zeichenfolgen als auch / oder JS-Datumsobjekte akzeptiert.

Ich habe es benannt, gregorianAge()weil diese Berechnung genau angibt, wie wir das Alter mit dem Gregorianischen Kalender bezeichnen. dh das Endjahr wird nicht gezählt, wenn Monat und Tag vor dem Monat und dem Tag des Geburtsjahres liegen.

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

Zwei weitere Optionen:

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

Ich habe einige auf eine vorherige Antwort aktualisiert.

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

Ich hoffe das hilft: D.

Fabricio
quelle
0

Hier ist eine einfache Methode zur Berechnung des Alters:

//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
quelle
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
quelle
Es macht einen einfachen Jahresunterschied zwischen jetzt und dem Geburtsjahr. Dann subtrahiert es ein Jahr, wenn heute früher im Jahr als der Geburtstag ist (denken Sie darüber nach, Ihr Alter steigt im Laufe des Jahres an Ihrem Geburtstag)
Steve Goossens
0

Sie können dies zur Altersbeschränkung in Ihrem Formular verwenden -

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
quelle
0

Ich bin etwas zu spät, aber ich fand, dass dies der einfachste Weg ist, ein Geburtsdatum zu berechnen.

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

Das HTML-Tag:

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

Hoffentlich hilft das.

TWDbag
quelle
-1

Hier ist die einfachste und genaueste Lösung, die ich finden konnte:

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

Und hier ist ein Beispiel, das den 29. Februar -> 28. Februar pro Jahr berücksichtigt.

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

Es funktioniert sogar mit negativem Alter!

Wizulus
quelle
Wie alle anderen hält es 2000-02-29 bis 2001-02-28 für null Jahre.
RobG
Ich habe meine Antwort aktualisiert, um dem Schaltjahr-Randfall Rechnung zu tragen. Danke @RobG
wizulus
-1

Noch eine andere Lösung:

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

Mit der momentjs "fromNow" -Methode können Sie mit dem formatierten Datum arbeiten, dh: 15.03.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";

Als Prototypversion

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

}}

Nicolas Giszpenc
quelle