В библиотеке js-joda календарные сущности, связанные с названиями месяцев и дней недели, представлены строго типизированными перечислениями, повторяющими модель Java Time API. Это обеспечивает предсказуемость поведения, отсутствие локализационных ошибок на уровне хранения данных и единый способ работы с календарными значениями независимо от формата вывода.
В js-joda каждый месяц представлен как часть перечисления
Month:
Month.JANUARYMonth.FEBRUARYMonth.MARCHMonth.APRILMonth.MAYMonth.JUNEMonth.JULYMonth.AUGUSTMonth.SEPTEMBERMonth.OCTOBERMonth.NOVEMBERMonth.DECEMBERКаждый элемент является неизменяемым объектом, а не числовым значением, что исключает неоднозначность при арифметических операциях и повышает читаемость кода.
Каждый месяц связан с числовым индексом в диапазоне 1–12:
import { Month } from '@js-joda/core';
Month.JANUARY.value(); // 1
Month.DECEMBER.value(); // 12
Использование value() важно при интеграции с внешними
системами, где месяцы представлены числами (например, API, базы данных,
протоколы обмена).
Обратное преобразование выполняется через of():
Month.of(1); // JANUARY
Month.of(12); // DECEMBER
При передаче некорректного значения (0 или 13) возникает исключение, что позволяет выявлять ошибки на этапе выполнения, а не в логике обработки дат.
Перечисление поддерживает естественный порядок:
Month.JANUARY.compareTo(Month.MARCH); // < 0
Month.DECEMBER.compareTo(Month.APRIL); // > 0
Также доступны проверки:
Month.JANUARY.isBefore(Month.FEBRUARY); // true
Month.DECEMBER.isAfter(Month.APRIL); // true
Поддерживаются циклические операции:
Month.DECEMBER.plus(1); // JANUARY
Month.JANUARY.minus(1); // DECEMBER
Это поведение отражает календарную цикличность без необходимости вручную обрабатывать переходы через границы года.
Дни недели в js-joda представлены следующим образом:
DayOfWeek.MONDAYDayOfWeek.TUESDAYDayOfWeek.WEDNESDAYDayOfWeek.THURSDAYDayOfWeek.FRIDAYDayOfWeek.SATURDAYDayOfWeek.SUNDAYНачалом недели считается понедельник, что соответствует ISO-8601.
Каждый день имеет фиксированное значение от 1 до 7:
import { DayOfWeek } from '@js-joda/core';
DayOfWeek.MONDAY.value(); // 1
DayOfWeek.SUNDAY.value(); // 7
Эта модель важна для интероперабельности с системами, использующими ISO-нумерацию дней недели.
DayOfWeek.of(1); // MONDAY
DayOfWeek.of(7); // SUNDAY
Некорректные значения вызывают исключение, что делает модель строгой и предсказуемой.
DayOfWeek.MONDAY.compareTo(DayOfWeek.FRIDAY); // < 0
DayOfWeek.SUNDAY.compareTo(DayOfWeek.MONDAY); // > 0
Дополнительно:
DayOfWeek.MONDAY.isBefore(DayOfWeek.WEDNESDAY); // true
DayOfWeek.SATURDAY.isAfter(DayOfWeek.FRIDAY); // true
DayOfWeek.MONDAY.plus(1); // TUESDAY
DayOfWeek.SUNDAY.plus(1); // MONDAY
DayOfWeek.MONDAY.minus(1); // SUNDAY
Цикличность особенно важна при расчёте рабочих графиков и календарных расписаний.
Сами перечисления Month и DayOfWeek не
содержат строковых названий. Для получения человекочитаемых форм
используется форматирование через DateTimeFormatter и
локализационные механизмы.
import { Month, DayOfWeek } from '@js-joda/core';
import { TextStyle, Locale } from '@js-joda/locale';
Month.JANUARY.getDisplayName(TextStyle.FULL, Locale.ENGLISH);
// "January"
DayOfWeek.MONDAY.getDisplayName(TextStyle.FULL, Locale.ENGLISH);
// "Monday"
Поддерживаются стили:
TextStyle.FULL — полное названиеTextStyle.SHORT — сокращённоеTextStyle.NARROW — минимальное обозначениеMonth.JANUARY.getDisplayName(TextStyle.FULL, Locale.ENGLISH); // January
Month.JANUARY.getDisplayName(TextStyle.FULL, Locale.FRENCH); // janvier
DayOfWeek.MONDAY.getDisplayName(TextStyle.SHORT, Locale.ENGLISH); // Mon
DayOfWeek.MONDAY.getDisplayName(TextStyle.SHORT, Locale.GERMAN); // Mo
При форматировании дат названия месяцев и дней недели формируются автоматически:
import { LocalDate, DateTimeFormatter } from '@js-joda/core';
import '@js-joda/locale';
const date = LocalDate.of(2026, Month.MARCH, 15);
const formatter = DateTimeFormatter.ofPattern('EEEE, d MMMM yyyy', Locale.ENGLISH);
date.format(formatter);
// "Sunday, 15 March 2026"
Ключевые шаблоны:
MMMM — полное название месяцаMMM — сокращённое название месяцаEEEE — полное название дня неделиE — короткая форма дня неделиconst date = LocalDate.of(2026, 5, 25);
date.month(); // Month.MAY
date.dayOfWeek(); // DayOfWeek.MONDAY
Это позволяет работать с календарными частями даты без строковых преобразований.
const isWeekend = (day) =>
day === DayOfWeek.SATURDAY || day === DayOfWeek.SUNDAY;
const isFirstHalfOfYear = (month) =>
month.value() <= 6;
Такие проверки остаются независимыми от локализации и форматов представления.
В стандартном Jav * aScript:
js-joda решает эти проблемы через:
Month и DayOfWeekconst nextMonth = Month.MARCH.plus(1); // APRIL
const nextDay = DayOfWeek.FRIDAY.plus(1); // SATURDAY
let day = DayOfWeek.MONDAY;
for (let i = 0; i < 10; i++) {
day = day.plus(1);
}
Все значения Month и DayOfWeek неизменяемы,
что исключает побочные эффекты при передаче между функциями.
Каждое значение существует в единственном экземпляре, что позволяет
безопасно сравнивать через ===:
Month.JANUARY === Month.of(1); // true
Эта модель унифицирует работу с календарями в разных системах.