Методы LocalDate

LocalDate — один из центральных типов библиотеки js-joda, предназначенный для работы с календарной датой без времени и часового пояса. Объект хранит только:

  • год;
  • месяц;
  • день месяца.

Тип используется для:

  • дней рождения;
  • бухгалтерских дат;
  • графиков;
  • отпусков;
  • дедлайнов;
  • календарных вычислений;
  • любых сценариев, где время суток не имеет значения.
const { LocalDate } = require('@js-joda/core');

const date = LocalDate.of(2025, 3, 15);

console.log(date.toString());
// 2025-03-15

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

Метод of()

Основной способ создания даты.

LocalDate.of(year, month, day)

Пример:

const date = LocalDate.of(2025, 12, 31);

console.log(date.toString());
// 2025-12-31

Использование перечисления Month

const { LocalDate, Month } = require('@js-joda/core');

const date = LocalDate.of(2025, Month.APRIL, 10);

console.log(date.toString());
// 2025-04-10

Метод now()

Возвращает текущую дату.

const today = LocalDate.now();

console.log(today.toString());

Метод parse()

Создание даты из строки.

const date = LocalDate.parse('2025-08-21');

console.log(date.toString());
// 2025-08-21

Строка должна соответствовать формату ISO-8601.


Получение компонентов даты

Метод year()

Возвращает год.

const date = LocalDate.parse('2025-06-18');

console.log(date.year());
// 2025

Метод monthValue()

Возвращает номер месяца.

console.log(date.monthValue());
// 6

Метод month()

Возвращает объект месяца.

console.log(date.month().toString());
// JUNE

Метод dayOfMonth()

Получение дня месяца.

console.log(date.dayOfMonth());
// 18

Метод dayOfYear()

Номер дня в году.

console.log(date.dayOfYear());
// 169

Метод dayOfWeek()

Получение дня недели.

console.log(date.dayOfWeek().toString());
// WEDNESDAY

Изменение даты

Объекты LocalDate неизменяемы (immutable). Любое изменение создаёт новый объект.


Метод plusDays()

Добавление дней.

const date = LocalDate.of(2025, 1, 10);

const newDate = date.plusDays(5);

console.log(newDate.toString());
// 2025-01-15

Исходный объект не меняется:

console.log(date.toString());
// 2025-01-10

Метод minusDays()

Вычитание дней.

const result = LocalDate.of(2025, 5, 20)
    .minusDays(7);

console.log(result.toString());
// 2025-05-13

Метод plusWeeks()

Добавление недель.

const result = LocalDate.of(2025, 2, 1)
    .plusWeeks(3);

console.log(result.toString());
// 2025-02-22

Метод minusWeeks()

const result = LocalDate.of(2025, 2, 1)
    .minusWeeks(2);

console.log(result.toString());
// 2025-01-18

Метод plusMonths()

Добавление месяцев.

const result = LocalDate.of(2025, 1, 15)
    .plusMonths(2);

console.log(result.toString());
// 2025-03-15

Коррекция даты при переполнении

const result = LocalDate.of(2025, 1, 31)
    .plusMonths(1);

console.log(result.toString());
// 2025-02-28

Библиотека автоматически корректирует невозможные даты.


Метод minusMonths()

const result = LocalDate.of(2025, 8, 31)
    .minusMonths(6);

console.log(result.toString());
// 2025-02-28

Метод plusYears()

const result = LocalDate.of(2020, 2, 29)
    .plusYears(1);

console.log(result.toString());
// 2021-02-28

Метод minusYears()

const result = LocalDate.of(2025, 9, 15)
    .minusYears(10);

console.log(result.toString());
// 2015-09-15

Замена отдельных частей даты

Метод withYear()

const result = LocalDate.of(2025, 4, 12)
    .withYear(2030);

console.log(result.toString());
// 2030-04-12

Метод withMonth()

const result = LocalDate.of(2025, 7, 10)
    .withMonth(12);

console.log(result.toString());
// 2025-12-10

Метод withDayOfMonth()

const result = LocalDate.of(2025, 7, 10)
    .withDayOfMonth(1);

console.log(result.toString());
// 2025-07-01

Метод withDayOfYear()

const result = LocalDate.of(2025, 1, 1)
    .withDayOfYear(100);

console.log(result.toString());
// 2025-04-10

Сравнение дат

Метод isBefore()

Проверка, находится ли дата раньше другой.

const a = LocalDate.parse('2025-01-01');
const b = LocalDate.parse('2025-06-01');

console.log(a.isBefore(b));
// true

Метод isAfter()

console.log(b.isAfter(a));
// true

Метод isEqual()

const x = LocalDate.parse('2025-03-15');
const y = LocalDate.parse('2025-03-15');

console.log(x.isEqual(y));
// true

Метод equals()

Строгое сравнение объектов.

console.log(x.equals(y));
// true

Работа с високосными годами

Метод isLeapYear()

console.log(LocalDate.of(2024, 1, 1).isLeapYear());
// true

console.log(LocalDate.of(2025, 1, 1).isLeapYear());
// false

Длина месяца и года

Метод lengthOfMonth()

Количество дней в месяце.

const date = LocalDate.of(2025, 2, 1);

console.log(date.lengthOfMonth());
// 28

Метод lengthOfYear()

console.log(date.lengthOfYear());
// 365

Начало и конец месяца

Получение первого дня месяца

const date = LocalDate.of(2025, 8, 18);

const firstDay = date.withDayOfMonth(1);

console.log(firstDay.toString());
// 2025-08-01

Получение последнего дня месяца

const date = LocalDate.of(2025, 2, 10);

const lastDay = date.withDayOfMonth(
    date.lengthOfMonth()
);

console.log(lastDay.toString());
// 2025-02-28

Проверка диапазонов

Проверка попадания даты в интервал

const current = LocalDate.parse('2025-06-15');

const start = LocalDate.parse('2025-06-01');
const end = LocalDate.parse('2025-06-30');

const isInRange =
    !current.isBefore(start) &&
    !current.isAfter(end);

console.log(isInRange);
// true

Вычисление возраста

const { LocalDate, Period } = require('@js-joda/core');

const birthday = LocalDate.parse('1995-04-10');
const today = LocalDate.now();

const age = Period.between(birthday, today);

console.log(age.years());

Работа с Period

Period хранит разницу между датами в годах, месяцах и днях.

Метод between()

const start = LocalDate.parse('2025-01-01');
const end = LocalDate.parse('2025-03-15');

const period = Period.between(start, end);

console.log(period.months()); // 2
console.log(period.days());   // 14

Преобразование в строку

Метод toString()

const date = LocalDate.of(2025, 11, 5);

console.log(date.toString());
// 2025-11-05

Работа с форматированием

Для расширенного форматирования используется пакет:

npm install @js-joda/locale
npm install @js-joda/timezone
npm install @js-joda/locale_ru

Использование DateTimeFormatter

const {
    LocalDate,
    DateTimeFormatter
} = require('@js-joda/core');

const date = LocalDate.parse('2025-12-31');

const formatter =
    DateTimeFormatter.ofPattern('dd.MM.yyyy');

console.log(date.format(formatter));
// 31.12.2025

Парсинг пользовательского формата

const formatter =
    DateTimeFormatter.ofPattern('dd/MM/yyyy');

const date = LocalDate.parse(
    '25/08/2025',
    formatter
);

console.log(date.toString());
// 2025-08-25

Работа с перечислением DayOfWeek

const {
    LocalDate,
    DayOfWeek
} = require('@js-joda/core');

const date = LocalDate.parse('2025-05-26');

console.log(date.dayOfWeek() === DayOfWeek.MONDAY);
// true

Проверка выходного дня

const day = date.dayOfWeek();

const isWeekend =
    day === DayOfWeek.SATURDAY ||
    day === DayOfWeek.SUNDAY;

console.log(isWeekend);

Генерация последовательности дат

let current = LocalDate.parse('2025-01-01');

const end = LocalDate.parse('2025-01-05');

while (!current.isAfter(end)) {
    console.log(current.toString());

    current = current.plusDays(1);
}

Результат:

2025-01-01
2025-01-02
2025-01-03
2025-01-04
2025-01-05

Типичные ошибки

Изменение исходного объекта

Неверно:

let date = LocalDate.now();

date.plusDays(1);

console.log(date);

Метод не изменяет объект.

Правильно:

date = date.plusDays(1);

Использование неверного месяца

В стандартном Date месяцы начинаются с нуля.

В LocalDate месяцы начинаются с единицы.

LocalDate.of(2025, 1, 1);

Январь — это 1, а не 0.


Практические сценарии

Дедлайн через 30 дней

const deadline =
    LocalDate.now().plusDays(30);

console.log(deadline.toString());

Последний день текущего месяца

const today = LocalDate.now();

const lastDay = today.withDayOfMonth(
    today.lengthOfMonth()
);

console.log(lastDay.toString());

Проверка просрочки

const expireDate =
    LocalDate.parse('2025-06-01');

const expired =
    LocalDate.now().isAfter(expireDate);

console.log(expired);

Получение даты через квартал

const nextQuarter =
    LocalDate.now().plusMonths(3);

console.log(nextQuarter.toString());

Совместное использование с LocalDateTime

const {
    LocalDate,
    LocalTime,
    LocalDateTime
} = require('@js-joda/core');

const date = LocalDate.now();

const time = LocalTime.of(14, 30);

const dateTime =
    LocalDateTime.of(date, time);

console.log(dateTime.toString());

Совместное использование с ZonedDateTime

const {
    LocalDate,
    LocalTime,
    ZoneId,
    ZonedDateTime
} = require('@js-joda/core');

const zoned = ZonedDateTime.of(
    LocalDate.now(),
    LocalTime.NOON,
    ZoneId.of('Europe/Moscow')
);

console.log(zoned.toString());

Преимущества LocalDate

  • неизменяемость объектов;
  • безопасная работа с датами;
  • отсутствие проблем стандартного Date;
  • удобные арифметические операции;
  • ISO-8601 по умолчанию;
  • предсказуемое поведение;
  • читаемый API;
  • поддержка сложных календарных вычислений;
  • отсутствие зависимости от часового пояса;
  • совместимость с Java API java.time.