2011-11-16 22 views
18

Chcę uzyskać liczbę lat między dwiema datami. Mogę uzyskać liczbę dni między tymi dwoma dniami, ale jeśli podzielę ją przez 365, wynik jest nieprawidłowy, ponieważ niektóre lata mają 366 dni.Jak mogę obliczyć liczbę lat między dwiema datami?

To jest mój kod, aby uzyskać datę różnicę:

var birthday = value;//format 01/02/1900 
var dateParts = birthday.split("/"); 

var checkindate = new Date(dateParts[2], dateParts[0] - 1, dateParts[1]); 
var now = new Date(); 
var difference = now - checkindate; 
var days = difference/(1000*60*60*24); 

var thisyear = new Date().getFullYear(); 
var birthyear = dateParts[2]; 

    var number_of_long_years = 0; 
for(var y=birthyear; y <= thisyear; y++){ 

    if((y % 4 == 0 && y % 100 == 0) || y % 400 == 0) { 

        number_of_long_years++;    
    } 
} 

Ilość dni działa idealnie. Próbuję zrobić dodać dodatkowe dni, kiedy to w roku 366-dni, a ja robię tak:

var years = ((days)*(thisyear-birthyear)) 
      /((number_of_long_years*366) + ((thisyear-birthyear-number_of_long_years)*365)); 

Dostaję licznik rok. Czy to jest poprawne, czy jest lepszy sposób na zrobienie tego?

+0

Mogło to działać? http://www.datejs.com/ –

+5

To jest ** javascript ** nie ** [jquery] (http://jquery.com) ** – Matt

+0

mm rzeczywiście dodać dodatkowe dane jest źle, myślę, że tak będę usunąć to –

Odpowiedz

17

Prawdopodobnie nie jest to odpowiedź, której szukasz, ale przy 2,6 kb, nie próbowałbym odkrywać koła na nowo i użyłbym czegoś takiego jak moment.js. Nie ma żadnych zależności.

+0

dzięki ja spróbuję to –

+3

+1, za dobrą JavaScript biblioteka daty. –

1
for(var y=birthyear; y <= thisyear; y++){ 

if((y % 4 == 0 && y % 100 == 0) || y % 400 == 0) { 
days = days-366; 
number_of_long_years++; 
} else { 
    days=days-365; 
} 

year++; 

} 

można spróbować w ten sposób ??

5

Nie-do każdej pętli, bez dodatkowych jQuery plugin potrzebny ... Wystarczy zadzwonić poniżej funkcji .. dostał od Difference between two dates in years

 function dateDiffInYears(dateold, datenew) { 
      var ynew = datenew.getFullYear(); 
      var mnew = datenew.getMonth(); 
      var dnew = datenew.getDate(); 
      var yold = dateold.getFullYear(); 
      var mold = dateold.getMonth(); 
      var dold = dateold.getDate(); 
      var diff = ynew - yold; 
      if (mold > mnew) diff--; 
      else { 
       if (mold == mnew) { 
        if (dold > dnew) diff--; 
       } 
      } 
      return diff; 
     } 
21

Sleek fundamencie funkcji JavaScript.

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

Próbowałem Twojego rozwiązania, ale kiedy użyłem daty urodzin, która była tego samego dnia rok wcześniej, było napisane, że wiek wynosił 0, kiedy powinien wynosić 1. – tronman

+3

To niekoniecznie jest złe, ponieważ ten sam dzień rok później nie jest pełnym rokiem - to tylko wtedy, gdy data urodzin ma godzinę 00:00:00, a aktualna data to 24:00:00 na tym samym dzień - który jest 00:00:00 z ** następnego dnia **! Tak więc możesz chcieć dodać jeden dzień do wieku, zanim będziesz kontynuować. Wciąż ustawiłbym urodziny na urodziny, ponieważ przewiduję kłopoty, jeśli jest to> 0 i zaangażowane są pewne szalone zmiany czasu letniego/strefy czasowej. Lub 'setHours (24, 0, 0, 0)' na urodziny może? Lepiej przetestuj to dokładnie. – CoDEmanX

0

Ten Pomóc ...

 $("[id$=btnSubmit]").click(function() { 
     debugger 
     var SDate = $("[id$=txtStartDate]").val().split('-'); 
     var Smonth = SDate[0]; 
     var Sday = SDate[1]; 
     var Syear = SDate[2]; 
     // alert(Syear); alert(Sday); alert(Smonth); 
     var EDate = $("[id$=txtEndDate]").val().split('-'); 
     var Emonth = EDate[0]; 
     var Eday = EDate[1]; 
     var Eyear = EDate[2]; 
     var y = parseInt(Eyear) - parseInt(Syear); 
     var m, d; 
     if ((parseInt(Emonth) - parseInt(Smonth)) > 0) { 
      m = parseInt(Emonth) - parseInt(Smonth); 
     } 
     else { 
      m = parseInt(Emonth) + 12 - parseInt(Smonth); 
      y = y - 1; 
     } 
     if ((parseInt(Eday) - parseInt(Sday)) > 0) { 
      d = parseInt(Eday) - parseInt(Sday); 
     } 
     else { 
      d = parseInt(Eday) + 30 - parseInt(Sday); 
      m = m - 1; 
     } 
     // alert(y + " " + m + " " + d); 
     $("[id$=lblAge]").text("your age is " + y + "years " + m + "month " + d + "days"); 
     return false; 
    }); 
0

Data praca obliczanie poprzez Julian day number. Musisz wziąć pierwszy stycznia dwóch lat. Potem konwertujesz daty gregoriańskie na liczby z juliańskiego dnia, a potem robisz różnicę.

2

Trochę nieaktualna, ale tutaj jest funkcja, której można użyć!

function calculateAge(birthMonth, birthDay, birthYear) { 
    var currentDate = new Date(); 
    var currentYear = currentDate.getFullYear(); 
    var currentMonth = currentDate.getMonth(); 
    var currentDay = currentDate.getDate(); 
    var calculatedAge = currentYear - birthYear; 

    if (currentMonth < birthMonth - 1) { 
     calculatedAge--; 
    } 
    if (birthMonth - 1 == currentMonth && currentDay < birthDay) { 
     calculatedAge--; 
    } 
    return calculatedAge; 
} 

var age = calculateAge(12, 8, 1993); 
alert(age); 
3

Do obliczania wieku używam następujących elementów.

Nazwałem to gregorianAge(), ponieważ to obliczenie dokładnie określa, w jaki sposób oznaczamy wiek za pomocą kalendarza gregoriańskiego. tj. nie licząc ostatniego roku, 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) 
} 
2

Tak, moment.js jest bardzo dobry do tego:

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 
0
function getYearDiff(startDate, endDate) { 
    let yearDiff = endDate.getFullYear() - startDate.getFullYear(); 
    if (startDate.getMonth() > endDate.getMonth()) { 
     yearDiff--; 
    } else if (startDate.getMonth() === endDate.getMonth()) { 
     if (startDate.getDate() > endDate.getDate()) { 
      yearDiff--; 
     } else if (startDate.getDate() === endDate.getDate()) { 
      if (startDate.getHours() > endDate.getHours()) { 
       yearDiff--; 
      } else if (startDate.getHours() === endDate.getHours()) { 
       if (startDate.getMinutes() > endDate.getMinutes()) { 
        yearDiff--; 
       } 
      } 
     } 
    } 
    return yearDiff; 
} 

alert(getYearDiff(firstDate, secondDate)); 
Powiązane problemy