Определение leap-года

В библиотеке Moment.js работа с датами и временем упрощена за счет удобных методов для анализа, форматирования и вычислений. Одним из часто используемых аспектов является проверка, является ли конкретный год високосным. Високосный год — это год, который содержит 366 дней вместо привычных 365. Основное правило: год делится на 4, но не делится на 100, за исключением годов, делящихся на 400.

Создание объекта даты

Для начала необходимо создать объект Moment. Основные способы:

// Создание даты с текущим временем
const now = moment();

// Создание даты для конкретного года
const date = moment("2024-01-01", "YYYY-MM-DD");

// Создание даты с использованием конструктора Date
const anotherDate = moment(new Date(2024, 0, 1)); // Месяцы нумеруются с 0

Объект moment позволяет работать с датой и временем независимо от формата исходных данных. После создания объекта можно получать информацию о году, месяце, дне, а также выполнять вычисления и проверки.

Проверка високосного года

Moment.js предоставляет удобный метод isLeapYear(), который возвращает логическое значение:

const date = moment("2024-01-01");
console.log(date.isLeapYear()); // true
  • Метод isLeapYear() проверяет только год, к которому привязан объект moment.
  • Возвращает true, если год високосный, и false в противном случае.

Метод работает корректно для любого года в григорианском календаре, включая отрицательные годы (до нашей эры) и будущие даты.

Проверка текущего года

Для проверки текущего года достаточно создать объект с текущей датой:

const currentYear = moment();
if (currentYear.isLeapYear()) {
    console.log(`Год ${currentYear.year()} является високосным`);
} else {
    console.log(`Год ${currentYear.year()} не является високосным`);
}
  • Метод year() возвращает числовое значение года объекта moment.
  • isLeapYear() позволяет выполнять условные вычисления на лету, например, корректировку количества дней в феврале.

Определение високосного года для произвольного значения

Можно проверить високосность года, не создавая конкретную дату, используя временные объекты с заданным годом:

function checkLeapYear(year) {
    return moment([year]).isLeapYear();
}

console.log(checkLeapYear(2000)); // true
console.log(checkLeapYear(1900)); // false
console.log(checkLeapYear(2023)); // false
  • Конструктор moment([year]) создаёт объект даты с 1 января указанного года.
  • Это удобно для массовой проверки массива годов или при генерации календарей.

Влияние високосного года на вычисления

Високосный год напрямую влияет на операции с датами:

const leapYear = moment("2024-02-28");
leapYear.add(1, 'days');
console.log(leapYear.format("YYYY-MM-DD")); // 2024-02-29

const nonLeapYear = moment("2023-02-28");
nonLeapYear.add(1, 'days');
console.log(nonLeapYear.format("YYYY-MM-DD")); // 2023-03-01
  • Метод add() учитывает количество дней в месяце и корректно переносит дату.
  • Проверка isLeapYear() помогает прогнозировать поведение вычислений и корректно обрабатывать февраль.

Сравнение годов и фильтрация високосных

Moment.js позволяет фильтровать массив дат по високосности:

const years = [1999, 2000, 2001, 2004, 2100];
const leapYears = years.filter(y => moment([y]).isLeapYear());
console.log(leapYears); // [2000, 2004]
  • Такой подход полезен при генерации графиков, календарей и анализа исторических данных.
  • Используется в связке с массивами и методами map, filter и reduce.

Практические рекомендации

  1. Использовать isLeapYear() для любых проверок года, чтобы избежать ручного вычисления и ошибок.
  2. Сравнивать даты через Moment, а не через строковые или числовые манипуляции, для корректной работы с високосными годами.
  3. Учесть влияние на февраль при добавлении или вычитании дней, чтобы не допустить сдвигов в логике приложений.

Использование Moment.js для определения високосного года делает код чистым, предсказуемым и легко читаемым, избавляя от необходимости вручную реализовывать алгоритмы деления на 4, 100 и 400.