Moment.js - jak uzyskać liczbę lat od daty, a nie zaokrągloną w górę?

134

Próbuję obliczyć wiek osoby za pomocą Moment.js , ale okazuje się , że metoda fromNow, skądinąd użyteczna , zaokrągla lata. Na przykład, jeśli dzisiaj jest 27 grudnia 2012 r., A data urodzenia osoby to 26 lutego 1978 r., moment("02/26/1978", "MM/DD/YYYY").fromNow()Zwraca „35 lat temu”. Jak sprawić, by Moment.js ignorował liczbę miesięcy i po prostu zwracał liczbę lat (tj. 34) od daty?

aknuds1
źródło

Odpowiedzi:

227

Korzystanie z moment.js jest tak proste, jak:

var years = moment().diff('1981-01-01', 'years');
var days = moment().diff('1981-01-01', 'days');

Aby uzyskać dodatkowe informacje, możesz przeczytać oficjalną dokumentację moment.js .

Edwin Beltran
źródło
32

http://jsfiddle.net/xR8t5/27/

jeśli nie chcesz wartości ułamkowych:

var years = moment().diff('1981-01-01', 'years',false);
alert( years);

jeśli chcesz wartości ułamkowe:

var years = moment().diff('1981-01-01', 'years',true);
alert( years);

Jednostkami mogą być [sekundy, minuty, godziny, dni, tygodnie, miesiące, lata]

Razan Paul
źródło
4
Ta technika jest objęta odpowiedzią @ ebeltran, a twoja dyskusja na temat wartości ułamkowych nie ma nic wspólnego z pytaniem. Wolałbym to dodać jako komentarz.
aknuds1
22

Wydaje się, że istnieje funkcja różnicująca, która akceptuje przedziały czasowe do użycia, a także opcję nie zaokrąglania wyniku. Więc coś w stylu

Math.floor(moment(new Date()).diff(moment("02/26/1978","MM/DD/YYYY"),'years',true)))

Nie próbowałem tego i nie jestem do końca zaznajomiony z chwilą, ale wydaje się, że powinno to uzyskać to, czego chcesz (bez konieczności resetowania miesiąca).

user4815162342
źródło
Wygląda na to, że w tym scenariuszu nie ma potrzeby otrzymywania liczby zmiennoprzecinkowej od chwili, a następnie jej samodzielnego zaokrąglania. Wygląda na to, że moment poprawnie zaokrągla wynik obliczenia roku za pomocą funkcji diff.
chris
32
Od docs, ponieważ 2.0.0, chwila # diff zwróci liczbę zaokrągla się w dół, więc trzeba tylko: age = moment().diff(birthDate, 'years') .
SuperSkunk
13

Stwierdziłem, że działałoby zresetowanie miesiąca do stycznia dla obu dat (podanej daty i teraźniejszości):

> moment("02/26/1978", "MM/DD/YYYY").month(0).from(moment().month(0))
"34 years ago"
aknuds1
źródło
3
W moment.js v2.3.1 znajduje się metoda .fromNow (), która również może być pomocna.
Lucas Lazaro,
9

Ta metoda jest łatwa i wydajna.

Wartość to data, a „DD-MM-RRRR” to maska ​​daty.

moment().diff(moment(value, "DD-MM-YYYY"), 'years');
user2327748
źródło
7

Spróbuj tego:

 moment("02/26/1978", "MM/DD/YYYY").fromNow().split(" ")[0];

Wyjaśnienie:

Otrzymujemy ciąg podobny do tego: „23 dni temu”. Podziel go na tablicę: [„23”, „dni”, „temu”], a następnie weź pierwszy element „23”.

Fyodor Khruschov
źródło
3
Ten post jest automatycznie oznaczany jako niskiej jakości, ponieważ zawiera tylko kod. Czy mógłbyś go rozszerzyć, dodając tekst wyjaśniający, jak rozwiązuje problem?
Taifun
3

Ta metoda działa dla mnie. Sprawdza, czy dana osoba obchodziła urodziny w tym roku i w przeciwnym razie odejmuje rok.

// date is the moment you're calculating the age of
var now = moment().unix();
var then = date.unix();
var diff = (now - then) / (60 * 60 * 24 * 365);
var years = Math.floor(diff);

Edycja: pierwsza wersja nie działała idealnie. Zaktualizowany powinien

Rickard Andersson
źródło
To zadziałało, gdybym zmienił dni roku na 365,25, aby uwzględnić lata przestępne
bschipp
użycie 365,25 to przybliżenie, które może skończyć się łzami - wpisz, cal 1752aby zobaczyć, dlaczego
pgee70
2

Jeśli nie chcesz używać żadnego modułu do obliczania wieku

var age = Math.floor((new Date() - new Date(date_of_birth)) / 1000 / 60 / 60 / 24 / 365.25)
Ankit
źródło
2

Jeśli chcesz pokazać lata i pozostałe dni:

var m = moment(d.birthday.date, "DD.MM.YYYY");
var years = moment().diff(m, 'years', false);
var days = moment().diff(m.add(years, 'years'), 'days', false);
alert(years + ' years, ' + days + ' days');
Xdg
źródło
0

Wolę tę małą metodę.

function getAgeFromBirthday(birthday) {
    if(birthday){
      var totalMonths = moment().diff(birthday, 'months');
      var years = parseInt(totalMonths / 12);
      var months = totalMonths % 12;
        if(months !== 0){
           return parseFloat(years + '.' + months);
         }
    return years;
      }
    return null;
}
Dagan Bog-Computers
źródło