Cum pot calcula vârsta în ani, având o data de nastere a format AAAALLZZ? Este posibil folosind Data()
funcția?
Eu sunt în căutarea pentru o soluție mai bună decât o folosesc acum:
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);
Încercați acest lucru.
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;
}
Cred că singurul lucru care părea brut pe codul a fost substr
parte.
Vioară:
Mi-ar merge pentru lizibilitate:
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: Acest lucru are, de asemenea, probleme de precizie, astfel încât aceasta nu poate fi complet fie de încredere. Acesta poate fi de câteva ore, în câțiva ani, sau în perioada de vară (în funcție de orar).
În schimb mi-ar recomanda folosind o bibliotecă pentru acest lucru, dacă precizia este foarte important. De asemenea, @Naveens post
, este, probabil, cele mai exacte, cum ar fi't se bazeze pe timp de zi.
Obiective de referință: http://jsperf.com/birthday-calculation/15
Important: Acest răspuns nu't oferi un 100% corecte răspuns, este de aproximativ 10-20 de ore, în funcție de data.
nu Există soluții mai bune ( nu în aceste răspunsuri, oricum ). - naveen
Eu, desigur, n't rezista tentatiei de a lua provocarea și de a face o mai rapidă și mai scurtă ziua calculator decât actualul soluție acceptată. Punctul principal pentru soluția mea, este că matematica este rapid, astfel încât în loc de a folosi ramificare, și data model javascript oferă pentru a calcula o soluție folosim minunat matematica
Răspunsul pare ca acest lucru, și se execută de ~65% mai repede decât naveen's plus l's mult mai scurt:
function calcAge(dateString) {
var birthday = +new Date(dateString);
return ~~((Date.now() - birthday) / (31557600000));
}
Numărul magic: 31557600000 este 24 3600 365.25 * 1000 Care este durata de un an, pe durata de un an este de 365 de zile și 6 ore, care este de 0,25 zi. În final, am podea rezultat care ne dă final de vârstă.
Aici este de referință: http://jsperf.com/birthday-calculation
Pentru a sprijini OP's de date format puteți înlocui +nou Data(dateString);
cu +nou Data(d.substr(0, 4), d.substr(4, 2)-1, d.substr(6, 2));
Dacă puteți veni cu o soluție mai bună vă rugăm să împărtășiți! :-)
Curățați-o linie soluție folosind 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
Eu folosesc de un an de 365,25 de zile (0.25 pentru anii bisecți), care sunt 3.15576 e+10 milisecunde (365.25 24 60 60 1000) respectiv.
Cu ceva timp în urmă am făcut-o funcție cu acest scop:
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;
}
Este nevoie de un obiect date de intrare, astfel încât aveți nevoie pentru a analiza 'AAAALLZZ'
formatat data string:
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
Aici's my soluție, trebuie doar să treacă într-o parseable data:
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
}
Soluție alternativă, pentru că de ce nu:
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;
}
Pentru a testa dacă ziua a trecut deja sau nu, am defini o functie helper Data.prototip.getDoY
, care efectiv returnează numărul zilei din an. Restul este destul de auto-explicative.
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));
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';
}
Am avut de a scrie această funcție pentru mine - a acceptat răspunsul este destul de bun, dar OMI-ar putea utiliza unele de curățire. Aceasta are un unix timestamp pentru dob pentru că era obligatorie, dar ar putea fi ușor adaptat pentru a utiliza un șir de caractere:
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));
}
Observa I'am folosit un tv cu valoarea de la 31 în measureDays funcție. Toate calcularea îi pasă este că "zi-de-an" fie monoton crescătoare măsură timestamp.
Dacă utilizați un javascript timestamp sau string, evident,'ll doriți să eliminați factor de 1000.
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;
}
Pentru a ajunge la vârsta când europeană data a intrat:
getAge('16-03-1989')
Cred că ar putea fi pur și simplu așa:
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
Funcționează, de asemenea, cu o amprentă de timp
age(403501000000)
//34
O alta solutie posibila cu 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
Am'am verificat exemple arătat-o mai înainte și le-am't a lucrat în toate cazurile, și din cauza asta am facut un script de-al meu. Am testat acest lucru, și funcționează perfect.
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);
Ca's cel mai elegant mod pentru mine:
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'));
Ia de vârstă (ani, luni și zile) de la data de naștere cu javascript
Funcția calcularEdad (ani, luni și zile)
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";
}
Funcția 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);
}
Eu sunt un pic prea târziu, dar am găsit acest lucru să fie cel mai simplu mod de a calcula data nașterii.
$(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-ul HTML:
<span id="myage"></span>
Sperăm că acest lucru va ajuta.
Știu că acest lucru este un foarte vechi thread dar am vrut să pun în această punere în aplicare care l-am scris pentru găsirea varsta care cred că este mult mai precisă.
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 ) ;
}
Desigur, ai putea adapta acest lucru pentru a se potrivi în alte formate de parametri. Sper că acest lucru ajută cineva în căutarea pentru o soluție mai bună.