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

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

Ответ 1

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

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

Ответ 2

Пользоваться моментом .js так же просто, как:

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

Для дополнительной справки, вы можете прочитать официальную документацию moment.js.

Ответ 3

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

Единицы могут быть [секунды, минуты, часы, дни, недели, месяцы, годы]

Ответ 4

Кажется, существует функция разница, которая принимает временные интервалы для использования, а также возможность не округлять результат. Итак, что-то вроде

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

Я не пробовал это, и я не совсем знаком с моментом, но похоже, что это должно получить то, что вы хотите (без необходимости reset месяца).

Ответ 5

Этот метод прост и эффективен.

Значение - это дата и "DD-MM-YYYY" - это маска даты.

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

Ответ 6

Попробуйте следующее:

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

Пояснение:

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

Ответ 7

Этот метод работает для меня. Он проверяет, был ли у человека свой день рождения в этом году и вычитает год в противном случае.

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

Изменить: Первая версия не совсем работает. Обновленный должен

Ответ 8

Если вы не хотите использовать какой-либо модуль для расчета возраста

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

Ответ 9

Когда вы хотите показать годы и оставшиеся дни:

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

Ответ 10

Я предпочитаю этот маленький метод.

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;
}

Ответ 11

забыть момент, написать свой собственный!

getAge(date) {
    const dob = new Date(date)
    const now = new Date()
    const diff = now - dob
    return Math.floor(diff/(1000 * 60 * 60 * 24 * 365))
}

Это, конечно, не учитывает високосные годы, поэтому игнорируйте этот ответ.