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


131

Я пытаюсь вычислить возраст человека с помощью Moment.js , но обнаружил, что полезный в остальном метод fromNow округляет годы. Например, если сегодня 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)))

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


Похоже, вам не нужно получать число с плавающей запятой с момента, а затем округлять его самостоятельно для этого сценария. Похоже, что момент правильно округляет результат для расчета года с помощью diff.
Крис

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

Это простой и мощный метод.

Значение - это дата, а «ДД-ММ-ГГГГ» - это маска даты.

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.