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?

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 .


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]


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


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"

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

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”.


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


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)

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

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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.