Moment.js - як мені отримати кількість років з дати, а не округлену?


130

Я намагаюся обчислити вік людини за допомогою Moment.js , але виявляю , що інакше корисний метод Nowow округляє роки. Наприклад, якщо сьогодні 27.12.2012, а дата народження людини - 26.02.1978, moment("02/26/1978", "MM/DD/YYYY").fromNow()повертається "35 років тому". Як я можу змусити Moment.js ігнорувати кількість місяців і просто повернути кількість років (тобто 34) з дати?

Відповіді:



30

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

якщо ви не хочете значення дробу:

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

якщо ви хочете значення дробу:

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

Одиниці можуть бути [секунди, хвилини, години, дні, тижні, місяці, роки]


3
Ця методика охоплюється відповіддю @ ebeltran, і ваше обговорення дробових значень не має нічого спільного з питанням. Я б краще додати це як коментар.
aknuds1

21

Здається, є різницева функція, яка приймає часові інтервали для використання, а також можливість не округляти результат. Отже, щось на кшталт

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

Я не пробував цього, і я не повністю знайомий з моментом, але, схоже, для цього слід отримати те, що ви хочете (без необхідності скидання місяця).


Здається, вам не потрібно отримувати номер плаваючої точки з моменту, а потім округляти його самостійно для цього сценарію. Схоже, момент правильного округлення результату для розрахунку року, використовуючи розл.
chris

31
З документів, так як 2.0.0, момент # дифф буде повертати число округляється в меншу сторону , так що вам потрібно всього лише: age = moment().diff(birthDate, 'years') .
SuperSkunk

13

Я виявив, що буде працювати для скидання місяця на січень для обох дат (передбаченої дати та сьогодення):

> moment("02/26/1978", "MM/DD/YYYY").month(0).from(moment().month(0))
"34 years ago"

3
У moment.js v2.3.1 існує метод .fromNow (), який також може бути корисним.
Лукас Лазаро

9

Цей метод легкий і потужний.

Значення - дата, а "DD-MM-РРРР" - маска дати.

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

6

Спробуйте це:

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

Пояснення:

Ми отримуємо рядок приблизно так: "23 дні тому". Розділіть його на масив: ['23', 'days', 'ago'], а потім візьміть перший елемент '23'.


3
Ця публікація автоматично позначена як низька якість, оскільки це лише код. Ви не хочете розширити його, додавши текст, щоб пояснити, як він вирішує проблему?
Тайфун

3

Цей метод працює для мене. Це перевірка, якщо у цього року у людини день народження, і віднімає один рік інакше.

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

Редагувати: Перша версія не дуже спрацювала. Оновлений повинен


Це працювало для мене, якщо я змінив дні року на 365,25, щоб врахувати високосні роки
bschipp

використання 365,25 - це наближення, яке може закінчитися сльозами - введіть, cal 1752щоб зрозуміти, чому
pgee70

2

Якщо ви не хочете використовувати будь-який модуль для обчислення віку

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

2

Коли ви хочете показати роки та інші дні:

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

Я віддаю перевагу цьому маленькому методу.

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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.