403 Stimmen

Berechnung des Alters anhand des Geburtsdatums im Format JJJJMMTT

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

Ich bin auf der Suche nach einer besseren Lösung als der, die ich jetzt benutze:

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

685voto

naveen Punkte 50832

Versuchen Sie 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 in Ihrem Code grob aussah, war die substr Teil.

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

323voto

André Snede Punkte 9451

Ich würde mich für die Lesbarkeit entscheiden:

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: Auch hier gibt es Probleme mit der Genauigkeit, so dass man sich auch hier nicht ganz darauf verlassen kann. Sie kann in manchen Jahren oder während der Sommerzeit (je nach Zeitzone) um ein paar Stunden abweichen.

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


90voto

Lucas Janon Punkte 1292

Saubere Einzeiler-Lö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 mit 365,25 Tagen (0,25 wegen der Schaltjahre), die jeweils 3,15576e+10 Millisekunden (365,25 * 24 * 60 * 60 * 1000) entsprechen.

Es hat nur wenige Stunden Spielraum, so dass es je nach Anwendungsfall nicht die beste Option ist.

70voto

Vitor Tyburski Punkte 1022

Mit momentjs:

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

16voto

Christian C. Salvadó Punkte 763569

Vor einiger Zeit habe ich zu diesem Zweck eine Funktion entwickelt:

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

Sie nimmt ein Datumsobjekt als Eingabe, also müssen Sie die 'YYYYMMDD' formatierte Datumszeichenfolge:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X