Практические примеры расчета возраста и длительности

Для начала работы с библиотекой Moment.js необходимо понимать, как создаются объекты времени. Основной способ — вызов функции moment():

const now = moment(); // текущая дата и время
const specificDate = moment("1990-05-15", "YYYY-MM-DD"); // конкретная дата

Важно учитывать, что Moment.js поддерживает несколько форматов ввода: строки, объекты JavaScript Date, Unix-времена и массивы чисел [год, месяц, день, час, минута, секунда]. Месяцы индексируются с нуля, поэтому январь — 0, декабрь — 11.


Форматы отображения даты и времени

Для вывода дат и времени используются методы format() и toString():

console.log(now.format("YYYY-MM-DD")); // 2026-05-21
console.log(now.format("DD/MM/YYYY HH:mm:ss")); // 21/05/2026 14:35:20

Ключевые моменты форматирования:

  • YYYY — полный год;
  • MM — месяц с ведущим нулём;
  • DD — день месяца с ведущим нулём;
  • HH — часы 24-формата;
  • mm — минуты;
  • ss — секунды.

Расчет возраста

Возраст обычно определяется как разница между текущей датой и датой рождения. Для этого используется метод diff():

const birthDate = moment("1990-05-15", "YYYY-MM-DD");
const today = moment();
const age = today.diff(birthDate, "years");

Метод diff() принимает три параметра:

  1. Дата или объект Moment — от чего считается разница.
  2. Единица измерения"years", "months", "days", "hours", "minutes", "seconds".
  3. Флаг дробной части (необязательный) — true, если требуется точная разница с дробной частью.
const preciseAge = today.diff(birthDate, "years", true); // вернёт возраст с десятичной частью

Для вычисления возраста с точностью до месяцев можно комбинировать методы:

const years = today.diff(birthDate, "years");
const months = today.diff(birthDate.add(years, "years"), "months");

Работа с длительностями

Moment.js предоставляет объект duration для работы с интервалами времени. Он позволяет складывать, вычитать и форматировать интервалы:

const duration = moment.duration(2, "years"); // 2 года
const detailedDuration = moment.duration({ years: 1, months: 6, days: 12 });

Методы объекта duration:

  • asYears(), asMonths(), asDays() — возвращают длительность в указанных единицах;
  • years(), months(), days(), hours(), minutes(), seconds() — возвращают целое число для каждой компоненты.

Пример использования для вычисления разницы между двумя датами:

const start = moment("2020-01-01");
const end = moment("2023-05-21");
const diff = moment.duration(end.diff(start));

console.log(diff.years()); // 3
console.log(diff.months()); // 4
console.log(diff.days()); // 20

Добавление и вычитание времени

Методы add() и subtract() позволяют изменять дату на определённый интервал:

const date = moment("2026-05-21");
date.add(5, "days"); // прибавить 5 дней
date.subtract(2, "months"); // вычесть 2 месяца

Эти методы поддерживают сложные объекты:

date.add({ years: 1, months: 3, days: 7 });

Форматирование длительности

Чтобы преобразовать объект duration в человекочитаемый вид, можно использовать комбинацию методов:

const duration = moment.duration({ years: 2, months: 5, days: 12 });
console.log(`${duration.years()} лет, ${duration.months()} месяцев, ${duration.days()} дней`);

Для более компактного отображения можно вычислять общие дни или часы:

console.log(duration.asDays()); // общая длительность в днях
console.log(duration.asHours()); // общая длительность в часах

Практический пример: расчет возраста и дней до следующего дня рождения

const birthDate = moment("1990-05-15", "YYYY-MM-DD");
const today = moment();

const age = today.diff(birthDate, "years");
const nextBirthday = birthDate.add(age + 1, "years");
const daysToBirthday = nextBirthday.diff(today, "days");

console.log(`Возраст: ${age} лет`);
console.log(`До следующего дня рождения: ${daysToBirthday} дней`);

Практический пример: суммарная длительность проектов

const project1 = moment.duration({ months: 6, days: 12 });
const project2 = moment.duration({ months: 4, days: 18 });
const totalDuration = moment.duration(project1).add(project2);

console.log(`Общая длительность: ${totalDuration.years()} лет, ${totalDuration.months()} месяцев, ${totalDuration.days()} дней`);

Важные нюансы и подводные камни

  • Мутация объектов: методы add(), subtract(), year(), month() изменяют оригинальный объект. Для создания нового экземпляра используется .clone().
  • Учёт високосных лет: при вычислении разницы в годах и месяцах библиотека корректно учитывает високосные года.
  • Индексация месяцев: январь — 0, декабрь — 11. При работе с пользовательским вводом важно правильно преобразовывать.

Эти методы Moment.js позволяют гибко и точно вычислять возраст, длительность и разницу между датами, упрощая работу с временными интервалами в любых приложениях на JavaScript.