Calcola l'età in base alla data di nascita nel formato AAAAMMGG


285

Come posso calcolare un'età in anni, data una data di nascita nel formato AAAAMMGG? È possibile usare la Date()funzione?

Sto cercando una soluzione migliore di quella che sto usando ora:

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


Tieni presente la tua formattazione, non farlo come hai fatto; basta rientrare il codice con 4 spazi usando il pulsante code (010101) o Ctrl-K.
Marcel Korpel,

L'ho fatto ma non funziona su IE9 Beta, quindi ho dovuto farlo a mano.
Francisc,

4
La tua soluzione originale è migliore, nel calcolare l'età, rispetto alle risposte attuali. La risposta di Júlio Santos è essenzialmente la stessa cosa. Le altre risposte danno risultati imprecisi in molte condizioni e possono essere meno semplici o meno efficienti.
Brock Adams,

Grazie Brock. Speravo che ci fosse un modo più elegante di farlo rispetto a quello che sembra un po 'rozzo.
Francisc,

4
@Francisc, è rozzo, ma è ciò che l' Dateoggetto dovrebbe fare se lo incapsulasse. Le persone potevano scrivere libri sulla schifezza della Dategestione di JS . ... Se riesci a convivere a volte con una pausa di un giorno, allora l'approssimazione: AgeInYears = Math.floor ( (now_Date - DOB_Date) / 31556952000 )è più semplice che puoi ottenere.
Brock Adams,

Risposte:


246

Vorrei andare per leggibilità:

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

Disclaimer: anche questo ha problemi di precisione, quindi non ci si può fidare completamente di questo. Può essere spento per alcune ore, alcuni anni o durante l'ora legale (a seconda del fuso orario).

Invece, consiglierei di usare una libreria per questo, se la precisione è molto importante. Inoltre @Naveens post, è probabilmente il più preciso, in quanto non si basa sull'ora del giorno.


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


3
Questo restituisce 0 anni per date come 2000-02-29 a 2001-02-28 quando probabilmente dovrebbe tornare 1.
RobG

16
@RobG Non credo che un intero anno sia tecnicamente passato dal 29-02-2002 al 28-02-2001, rendendo la tua risposta non valida. Non avrebbe senso, dal 2000-02-28 al 2001-02-28 è un anno, quindi dal 2000-02-29 al 2001-02-28, deve essere inferiore a un anno.
André Snede Kock,

3
Non hai approfondito il significato di "non preciso", ho pensato che informazioni aggiuntive potrebbero essere utili. Potresti prendere in considerazione la possibilità di risolvere i problemi o eliminare la risposta.
RobG

1
@RobG In realtà l'ho fatto. Ho anche indicato una soluzione migliore della mia. La mia soluzione risolve il problema in modo facile da leggere, con problemi di precisione minori, ma entro i limiti del suo scopo.
André Snede Kock,

1
Bella risposta @ AndréSnedeHansen e anche veloce, dal momento che non hai quella divisione folle come è presente nella mia risposta ;-) +1 per leggibilità e velocità.
Kristoffer Dorph,

507

Prova questo.

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

Credo che l'unica cosa che sembrava grezza nel tuo codice fosse la substrparte.

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


Puoi fare un esempio di utilizzo? Non riuscivo a farlo funzionare senza modificare la funzione per accettare 3 argomenti separati, come: getAge (y, m, d). Ad esempio: jsbin.com/ehaqiw/1/edit
edt,

Come molti altri, questo ritiene che dal 2000-02-29 al 2001-02-28 sia zero anni, quando molto probabilmente dovrebbe essere 1 (dal 2001-03-01 dovrebbe essere 1 anno 1 giorno).
RobG

3
@RobG: quando i leapings 'celebrano' (la risposta comune a quella domanda sembra essere solo: 'il fine settimana più vicino alla data effettiva') il loro giorno di nascita differisce in base al contesto incluso: regione geografica (inglese semplice: dove vivi ), LEGGE (non sottovalutare quella), religione e preferenze personali (incluso il comportamento di gruppo): Alcuni motivi: "Sono nato a febbraio", altri motivi: "Sono nato il giorno dopo il 28 febbraio" (che è più comunemente il 1 ° marzo) en.wikipedia.org/wiki/February_29 Per quanto sopra questo algo è corretto SE il 1 ° marzo è il risultato bisestile di cui si ha bisogno
GitaarLAB

3
@RobG: il pozzo nero di 'più x mese (i)' è irrilevante per la nozione umana di età in anni. L'idea umana comune è che il contatore dell'età (InYears) aumenti ogni giorno (ignorando l'ora) quando il calendario ha lo stesso mese # e giorno # (rispetto alla data di inizio): in modo che 2000-02-28 a 2001-02 -27 = 0 anni e dal 2000-02-28 al 2001-02-28 = 1 anno. Estensione di tale "buon senso" ai salti: 2000-02-29 (il giorno dopo il 2000-02-28) a 2001-02-28 = zero anni . Il mio commento ha semplicemente affermato che l'algo con risposta fornisce sempre la risposta umana "corretta" SE uno si aspetta / accetta questa logica per i salti.
GitaarLAB,

3
@RobG: non ho mai detto che la risposta fosse universalmente corretta (TM). Ho incluso la nozione di contesti / giurisdizioni / punti di vista. Entrambi i miei commenti includono chiaramente un IF maiuscolo (verso la gestione dei salti di eccezione). In effetti, il mio primo commento affermava esattamente cosa intendevo dire e non includeva mai alcun giudizio in merito a ciò che era giusto o sbagliato. In effetti i miei commenti chiariscono cosa e cosa non aspettarsi (e perché) da questa risposta (come la chiami "evidenzia i problemi"). Ps: 31 febbraio?!?
GitaarLAB,

72

Importante: questa risposta non fornisce una risposta accurata al 100%, è disattivata di circa 10-20 ore a seconda della data.

Non ci sono soluzioni migliori (non in queste risposte comunque). - naveen

Ovviamente non ho resistito all'impulso di raccogliere la sfida e creare un calcolatore di compleanno più veloce e più breve rispetto alla soluzione attualmente accettata. Il punto principale della mia soluzione è che la matematica è veloce, quindi invece di usare la ramificazione, e il modello di data javascript fornisce per calcolare una soluzione usiamo la meravigliosa matematica

La risposta è simile a questa, e corre circa il 65% più veloce di quella di naveen e in più è molto più breve:

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

Il numero magico: 31557600000 è 24 * 3600 * 365,25 * 1000 Qual è la lunghezza di un anno, la lunghezza di un anno è di 365 giorni e 6 ore che è 0,25 giorni. Alla fine ho il risultato che ci dà l'età finale.

Ecco i benchmark: http://jsperf.com/birthday-calculation

Per supportare il formato dati di OP è possibile sostituire +new Date(dateString);
con+new Date(d.substr(0, 4), d.substr(4, 2)-1, d.substr(6, 2));

Se riesci a trovare una soluzione migliore, ti preghiamo di condividere! :-)


Questa è una soluzione davvero interessante. L'unico problema che vedo con esso è l' dateStringargomento giusto per il costruttore Date () per analizzarlo correttamente. Ad esempio, prendendo il YYYYMMDDformato che ho dato nella domanda, fallirà.
Francisc,

22
Questa risposta contiene un bug. Imposta l'orologio alle 12:01. Alle 00:01, se calcAge ('2012-03-27') (data odierna) riceverai una risposta pari a zero, anche se dovrebbe essere uguale a 1. Questo errore esiste per l'intera ora 12:00. Ciò è dovuto alla dichiarazione errata secondo cui un anno ha 365,25 giorni. Non è così. Abbiamo a che fare con anni di calendario, non con la lunghezza dell'orbita terrestre (che è più precisamente 365.256363 giorni). Un anno ha 365 giorni, tranne un anno bisestile che ha 366 giorni. Oltre a ciò, l'esecuzione su qualcosa di simile non ha senso. La manutenibilità è molto più importante.
Eric Brandel,

1
Grazie per la tua soluzione Kristoffer. Posso chiedere cosa fa il + nuovo rispetto al solo nuovo, e anche le due tilde (~) in cambio?
Frank Jensen,

1
@FrankJensen Ciao Frank, anch'io ero curioso e ho trovato questa risposta: la doppia tilde converte il float in numero intero Saluti
Stano

1
@FrankJensen essenzialmente la tilde inverte il numero (il valore binario) mentre converte float in intero (floored), quindi due tilde ti danno il numero arrotondato. Il + davanti alla nuova data () converte l'oggetto nella rappresentazione intera dell'oggetto data, questo può essere utilizzato anche con stringhe di numeri, ad esempio + '21 '=== 21
Kristoffer Dorph

55

Con momentjs:

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

2
@RicardoPontual richiede momentjs, quindi non può essere la risposta migliore.
itzmukeshy7,

13
@ itzmukeshy7 in effetti, affinché una risposta sia la migliore, dovrebbe almeno richiedere jQuery;)
thomaux,

@thomaux Dipende totalmente dall'ambiente di sviluppo!
itzmukeshy7,

@ itzmukeshy7 relax, è uno scherzo;) vedi: meta.stackexchange.com/a/19492/173875
thomaux

2
@thomaux sapevo che è uno scherzo;)
itzmukeshy7

38

Pulire la soluzione con una fodera usando 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

Sto usando un anno di 365,25 giorni (0,25 a causa degli anni bisestili) che sono rispettivamente 3.15576e + 10 millisecondi (365.25 * 24 * 60 * 60 * 1000).


1
Abbastanza pulito - potresti elaborare cosa significa 3.15576e + 10?
leonheess,

1
Sì, sarebbe bene aggiungere la seguente riga prima della funzione:const yearInMs = 3.15576e+10 // Using a year of 365.25 days (because leap years)
Lucas Janon,

12

Qualche tempo fa ho fatto una funzione con questo scopo:

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

Prende un oggetto Date come input, quindi è necessario analizzare la 'YYYYMMDD'stringa di data formattata:

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 sì, mi sono perso l'anno bisestile. Grazie.
Francisc,

1
Ciò fornisce valori non validi per determinate combinazioni di date! Ad esempio, se birthDateè il 5 gennaio 1980 e la data corrente è il 4 gennaio 2005 , la funzione indicherà erroneamente agecome 25 ... Il valore corretto è 24.
Brock Adams

@BrockAdams Perché questo? Sto avendo questo problema al momento. Grazie.
Jack H,

@VisionIncision, perché non gestisce correttamente le condizioni dei bordi. Che ci crediate o no, il codice della domanda è l'approccio migliore, anche se sembra che una delle risposte successive potrebbe averlo riconfezionato in modo più adeguato.
Brock Adams,

CMS Ciao :-) Ho scritto questa domanda ( stackoverflow.com/questions/16435981/… ) e mi è stato detto che se voglio una risposta accurata al 100% dovrei controllare ogni anno - se è un anno bisestile, e quindi calcolare l'ultimo frazione. (vedi la risposta di Guffa). La tua funzione (parte di essa) lo fa . ma come posso usarlo per calcolare l'età accurata al 100%? il DOB inizia raramente a 1/1 / aaaa ..... quindi come posso usare la tua funzione per calcolare l'età esatta?
Royi Namir,

10

Ecco la mia soluzione, basta passare una data analizzabile:

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

Soluzione alternativa, perché perché no:

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

Grazie facile da trovare l'età in anni mesi e giorni
Sumit Kumar Gupta

5

Per verificare se il compleanno è già passato o meno, definisco una funzione di supporto Date.prototype.getDoY, che restituisce effettivamente il numero del giorno dell'anno. Il resto è piuttosto autoesplicativo.

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

Ciò dà risultati imprecisi negli anni bisestili, per i compleanni dopo il 28 febbraio. Invecchia queste persone di 1 giorno. Ad esempio: per DoB = 2001/07/04 , questa funzione tornerà 7 anni, il 2008/07/03 .
Brock Adams,

@Brock: grazie. Se non sbaglio, ho corretto questo comportamento errato.
Marcel Korpel,

Sì, penso che potresti averlo (non testato rigorosamente, appena analizzato). Tuttavia, si noti che la nuova soluzione non è più semplice e non più elegante della soluzione OP (senza contare che questa è correttamente incapsulata in una funzione). ... La soluzione del PO è più facile da capire (quindi da verificare, testare o modificare). A volte semplice e diretto è il migliore, IMO.
Brock Adams,

@Brock: sono pienamente d'accordo: devo pensare a cosa fa questa funzione e non è mai una buona cosa.
Marcel Korpel,

"If (doyNow <doyBirth)" dovrebbe essere "if (doyNow <= doyBirth)"? In tutti i miei test, il giorno è stato spento da uno e questo l'ha riparato.
Ted Kulp,

5

Penso che potrebbe essere semplicemente così:

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

Funziona anche con un timestamp

age(403501000000)
//34

Questo codice calcolerà una persona della stessa età per tutto l'anno. Nel tuo esempio, se oggi fosse '09 / 19/2018 'il codice darebbe 37, ma l'età (il giorno prima del compleanno) sarebbe 36 ...
Steve Goossens

4

Ho dovuto scrivere questa funzione per me stesso - la risposta accettata è abbastanza buona ma IMO potrebbe usare un po 'di pulizia. Questo richiede un timestamp unix per dob perché quello era il mio requisito ma poteva essere rapidamente adattato per usare una stringa:

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

Nota che ho usato un valore flat di 31 nella mia funzione measureDays. Tutto il calcolo si preoccupa è che il "giorno dell'anno" sia una misura monotonicamente crescente del timestamp.

Se usi un timestamp o una stringa javascript, ovviamente vorrai rimuovere il fattore 1000.


n non è definito. Penso che intendi ora.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;
}

Per ottenere l'età quando è stata inserita la data europea:

getAge('16-03-1989')

Grazie per il suggerimento su stackoverflow.com/a/13367162/1055987 buona cattura.
JFK

3

Un'altra soluzione possibile con 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

2

Ho controllato gli esempi mostrati prima e non hanno funzionato in tutti i casi, e per questo motivo ho realizzato una mia sceneggiatura. L'ho provato e funziona perfettamente.

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

Il periodo dal 2000-02-29 al 2001-02-28 dovrebbe essere di un anno? In tal caso, quanto sopra non è perfetto. :-)
RobG

2

Questo è il modo più elegante per me:

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

Ottieni l'età (anni, mesi e giorni) dalla data di nascita con javascript

Funzione calcularEdad (anni, mesi e giorni)

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

Funzione 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

Funziona perfettamente per me, ragazzi.

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

0

So che questo è un thread molto vecchio, ma ho voluto mettere in questa implementazione che ho scritto per trovare l'età che credo sia molto più accurata.

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

Ovviamente potresti adattarlo per adattarlo ad altri formati per ottenere i parametri. Spero che questo aiuti qualcuno che cerca una soluzione migliore.


0

Ho usato questo approccio usando la logica anziché la matematica. È preciso e veloce. I parametri sono l'anno, il mese e il giorno del compleanno della persona. Restituisce l'età della persona come intero.

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

stringhe o oggetti data per l'input secondo OP
nazim

0

Adottando dai post di naveen e di OP originali ho finito con uno stub di metodo riutilizzabile che accetta sia stringhe che oggetti JS Date.

L'ho chiamato gregorianAge()perché questo calcolo fornisce esattamente come indichiamo l'età usando il calendario gregoriano. cioè Non contare l'anno di fine se mese e giorno sono precedenti al mese e al giorno dell'anno di nascita.

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

Altre due opzioni:

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

Ho aggiornato alcuni a una risposta precedente.

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

Spero che ciò aiuti: D


0

ecco un modo semplice per calcolare l'età:

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

Fa una semplice differenza di anno tra ora e l'anno di nascita. Quindi sottrae un anno se oggi è prima dell'anno rispetto al compleanno (pensaci, la tua età aumenta durante l'anno, il tuo compleanno)
Steve Goossens,

0

Puoi utilizzarlo come limite di età nel tuo modulo -

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

Sono un po 'troppo tardi, ma ho scoperto che questo è il modo più semplice per calcolare una data di nascita.

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

Il tag HTML:

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

Spero che questo possa aiutare.


-1

Ecco la soluzione più semplice e accurata che potrei trovare:

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

Ed ecco un esempio che prenderà in considerazione il 29 febbraio -> 28 febbraio all'anno.

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

Funziona anche con l'età negativa!


Come tutti gli altri, pensa che dal 2000-02-29 al 2001-02-28 sia pari a zero anni.
RobG

Ho aggiornato la mia risposta per accogliere il caso limite dell'anno bisestile. Grazie @RobG
wizulus il

-1

Ancora un'altra soluzione:

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

Con il metodo " fromNow " di momentjs, questo ti consente di lavorare con una data formattata, ovvero: 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";

Come una versione prototipo

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

}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.