Moment.js - Wie erhalte ich die Anzahl der Jahre seit einem Datum, nicht aufgerundet?

130

Ich versuche, das Alter einer Person mit Moment.js zu berechnen, stelle jedoch fest, dass die ansonsten nützliche fromNow- Methode die Jahre aufrundet . Wenn beispielsweise heute der 27.12.2012 ist und das Geburtsdatum der Person der 26.02.1978 ist, wird "vor moment("02/26/1978", "MM/DD/YYYY").fromNow()35 Jahren" zurückgegeben. Wie kann ich Moment.js dazu bringen, die Anzahl der Monate zu ignorieren und einfach die Anzahl der Jahre (dh 34) seit dem Datum zurückzugeben?

aknuds1
quelle

Antworten:

215

Die Verwendung von moment.js ist so einfach wie:

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

Als zusätzliche Referenz können Sie die offizielle Dokumentation von moment.j lesen .

Edwin Beltran
quelle
30

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

Wenn Sie keine Bruchwerte möchten:

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

Wenn Sie Bruchwerte wünschen:

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

Einheiten können [Sekunden, Minuten, Stunden, Tage, Wochen, Monate, Jahre] sein

Razan Paul
quelle
3
Diese Technik wird in der Antwort von @ ebeltran behandelt, und Ihre Diskussion über Bruchwerte hat nichts mit der Frage zu tun. Ich möchte es lieber als Kommentar hinzufügen.
aknuds1
21

Es scheint eine sein Differenzfunktion , die Zeitintervalle sowie eine Option , um zu verwenden , akzeptiert nicht um das Ergebnis. Also so etwas wie

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

Ich habe dies nicht ausprobiert und bin mit dem Moment nicht ganz vertraut, aber es scheint, dass dies das bekommen sollte, was Sie wollen (ohne den Monat zurücksetzen zu müssen).

user4815162342
quelle
Es scheint, dass Sie für dieses Szenario die Gleitkommazahl nicht sofort empfangen und dann selbst runden müssen. Es sieht so aus, als ob der Moment das Ergebnis für die Jahresberechnung mit diff korrekt rundet.
Chris
31
In den Dokumenten gibt Moment # diff seit 2.0.0 eine abgerundete Zahl zurück, sodass Sie nur : age = moment().diff(birthDate, 'years') .
SuperSkunk
13

Ich fand, dass es funktionieren würde, den Monat für beide Daten (das angegebene Datum und das Geschenk) auf Januar zurückzusetzen:

> moment("02/26/1978", "MM/DD/YYYY").month(0).from(moment().month(0))
"34 years ago"
aknuds1
quelle
3
In moment.js v2.3.1 gibt es eine .fromNow () -Methode, die ebenfalls hilfreich sein kann.
Lucas Lazaro
9

Diese Methode ist einfach und leistungsstark.

Wert ist ein Datum und "TT-MM-JJJJ" ist die Maske des Datums.

moment().diff(moment(value, "DD-MM-YYYY"), 'years');
user2327748
quelle
6

Versuche dies:

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

Erläuterung:

Wir erhalten einen String wie diesen: 'vor 23 Tagen'. Teilen Sie es in ein Array auf: ['23', 'Tage', 'vor'] und nehmen Sie dann das erste Element '23'.

Fjodor Chruschtschow
quelle
3
Dieser Beitrag wird automatisch als minderwertig gekennzeichnet, da es sich nur um Code handelt. Würde es Ihnen etwas ausmachen, es zu erweitern, indem Sie Text hinzufügen, um zu erklären, wie es das Problem löst?
Taifun
3

Diese Methode funktioniert bei mir. Es wird überprüft, ob die Person dieses Jahr Geburtstag hat, und es wird ein Jahr abgezogen, wenn dies nicht der Fall ist.

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

Edit: Die erste Version hat nicht ganz perfekt funktioniert. Das aktualisierte sollte

Rickard Andersson
quelle
Dies funktionierte für mich, wenn ich die Tage des Jahres auf 365,25 änderte, um Schaltjahre zu berücksichtigen
bschipp
Die Verwendung von 365,25 ist eine Annäherung, die in Tränen enden kann - geben Sie ein cal 1752, warum
pgee70
2

Wenn Sie kein Modul zur Altersberechnung verwenden möchten

var age = Math.floor((new Date() - new Date(date_of_birth)) / 1000 / 60 / 60 / 24 / 365.25)
Ankit
quelle
2

Wenn Sie Jahre und die verbleibenden Tage anzeigen möchten:

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
quelle
0

Ich bevorzuge diese kleine Methode.

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-Computer
quelle