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?

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 .


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


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


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"

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

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


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


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)

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

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;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.