Библиотека Luxon строится вокруг объекта DateTime,
который по умолчанию использует григорианский
календарь, но при этом поддерживает работу с альтернативными
календарными системами через механизм локализации и параметр
outputCalendar.
Календарная система в Luxon определяет не только формат отображения
даты, но и сам способ интерпретации года, месяца и дня в различных
культурных и религиозных традициях. Внутри библиотека опирается на
возможности Intl API, поэтому поддержка календарей зависит
от окружения выполнения.
Любая дата, созданная стандартными методами Luxon, интерпретируется в ISO-8601 представлении, которое фактически эквивалентно григорианскому календарю.
import { DateTime } from "luxon";
const dt = DateTime.now();
console.log(dt.toISO());
Внутренне это всегда:
Григорианский календарь является базовым, и все вычисления
(plus, minus, startOf,
endOf) выполняются именно в его логике, независимо от того,
как дата будет отображена.
Ключевой механизм работы с календарными системами в Luxon — параметр:
outputCalendar
Он определяет, в каком календаре будет отображаться дата, но не изменяет внутреннее хранение.
const dt = DateTime.now().setLocale("en");
console.log(dt.set({ outputCalendar: "buddhist" }).toString());
Возможный результат будет отличаться только визуально, например год может быть смещён (в буддийском календаре он обычно на +543 года относительно григорианского).
Luxon опирается на Intl.DateTimeFormat, поэтому список
доступных календарей фиксирован и зависит от ICU:
gregory — григорианский календарь (по умолчанию)buddhist — буддийский календарьchinese — китайский лунно-солнечный календарьislamic — исламский календарь (хиджра)hebrew — еврейский календарьindian — индийский национальный календарьjapanese — японские эры (Reiwa, Heisei и т.д.)Наиболее прямой способ изменить календарную систему — указать
outputCalendar при форматировании или через
set.
const dt = DateTime.local(2026, 5, 23);
const hebrew = dt.set({ outputCalendar: "hebrew" });
const islamic = dt.set({ outputCalendar: "islamic" });
console.log(hebrew.toString());
console.log(islamic.toString());
Важно: сам объект DateTime остаётся неизменяемым. Каждый
вызов set создаёт новый экземпляр.
Календарная система проявляется в форматировании строк:
const dt = DateTime.local(2026, 5, 23);
console.log(dt.set({ outputCalendar: "gregory" }).toLocaleString(DateTime.DATE_FULL));
console.log(dt.set({ outputCalendar: "buddhist" }).toLocaleString(DateTime.DATE_FULL));
Разница будет в представлении года и иногда названия месяца, в зависимости от локали.
Ключевой принцип Luxon:
Календарная система влияет только на отображение, но не на математические операции.
const dt = DateTime.local(2026, 5, 23);
const nextWeek = dt.plus({ days: 7 });
console.log(nextWeek.set({ outputCalendar: "islamic" }).toISO());
Здесь:
plus({ days: 7 }) всегда добавляет 7 дней в
ISO-календареoutputCalendar лишь меняет интерпретацию
результатаКалендарь тесно связан с локалью:
const dt = DateTime.local(2026, 5, 23);
console.log(dt.setLocale("ja").set({ outputCalendar: "japanese" }).toString());
Японский календарь использует эры, например:
Luxon не вычисляет эти эры вручную — они предоставляются системой
Intl.
Несмотря на поддержку разных календарей, есть важные ограничения:
Luxon не хранит дату как “объект календаря”. Внутреннее представление всегда ISO.
dt.plus({ months: 1 })
всегда означает календарное смещение в григорианской системе.
Некоторые календари могут быть недоступны в старых средах выполнения JavaScript.
Китайский календарь особенно интересен, так как он лунно-солнечный:
const dt = DateTime.local(2026, 5, 23);
console.log(dt.set({ outputCalendar: "chinese" }).toLocaleString(DateTime.DATE_FULL));
Особенности:
Исламский календарь (islamic) является лунным и короче
григорианского примерно на 11 дней в год:
const dt = DateTime.local(2026, 5, 23);
const islamic = dt.set({ outputCalendar: "islamic" });
console.log(islamic.toLocaleString(DateTime.DATE_FULL));
Характеристики:
const dt = DateTime.local(2026, 5, 23);
console.log(dt.set({ outputCalendar: "hebrew" }).toLocaleString(DateTime.DATE_FULL));
Особенности:
const dt = DateTime.local(2026, 5, 23);
console.log(dt.set({ outputCalendar: "japanese" }).toLocaleString(DateTime.DATE_FULL));
Система основана на императорских эрах:
Luxon отображает дату через механизм ICU, который вычисляет текущую эру автоматически.
const dt = DateTime.local(2026, 5, 23);
console.log(dt.set({ outputCalendar: "indian" }).toLocaleString(DateTime.DATE_FULL));
Используется в официальных документах Индии:
Календарная система часто используется вместе с часовыми поясами:
const dt = DateTime.now().setZone("Asia/Almaty");
const formatted = dt.set({ outputCalendar: "islamic" }).toString();
console.log(formatted);
Здесь:
setZone управляет временемoutputCalendar управляет представлением датыПри преобразовании в строки:
const dt = DateTime.local(2026, 5, 23);
const json = dt.set({ outputCalendar: "hebrew" }).toJSON();
важно понимать:
outputCalendar не сохраняется в сериализацииПри переключении outputCalendar:
const dt = DateTime.local(2026, 5, 23);
const a = dt.set({ outputCalendar: "gregory" });
const b = dt.set({ outputCalendar: "buddhist" });
console.log(a.ts === b.ts); // true
Это ключевая гарантия неизменности временной точки независимо от календаря.