В библиотеке Luxon управление форматированием дат и времени основано
на международном стандарте ICU и возможностях
Intl.DateTimeFormat. Одним из ключевых аспектов локализации
является календарная система, определяющая способ представления дат.
Settings.defaultOutputCalendar задаёт календарь по
умолчанию, который используется при форматировании объектов
DateTime, если календарь явно не указан.
Календарь влияет исключительно на отображение, не изменяя внутреннее представление времени (которое всегда хранится в UTC-основанной временной шкале).
Настройка находится в глобальном объекте конфигурации Luxon:
import { Settings } from "luxon";
Settings.defaultOutputCalendar = "gregory";
После установки любое форматирование, использующее локализацию, будет учитывать выбранную календарную систему.
Luxon опирается на Intl, поэтому список календарей
соответствует ICU календарям:
Каждый из них влияет на отображение года, месяца и иногда структуры даты.
Настройка применяется при использовании методов локализации:
toLocaleString()toLocaleDateString()toFormat() (в некоторых локализационных шаблонах через
Intl)Intl.DateTimeFormat под
капотомПример:
import { DateTime, Settings } from "luxon";
const dt = DateTime.fromISO("2026-01-15T10:00:00");
Settings.defaultOutputCalendar = "gregory";
console.log(dt.toLocaleString(DateTime.DATE_FULL));
Вывод будет соответствовать григорианскому календарю.
При смене календарной системы изменяется представление года и иногда структура даты.
import { DateTime, Settings } from "luxon";
const dt = DateTime.fromObject({
year: 2026,
month: 5,
day: 23
});
Settings.defaultOutputCalendar = "gregory";
console.log(dt.toLocaleString(DateTime.DATE_FULL));
Settings.defaultOutputCalendar = "japanese";
console.log(dt.toLocaleString(DateTime.DATE_FULL));
В японской системе отображение года может включать эру (например, Reiwa), что делает результат отличным от привычного западного формата.
Календарная система тесно связана с локалью
(Settings.defaultLocale). При отсутствии явного указания
календаря Luxon комбинирует:
Settings.defaultOutputCalendarПример:
import { Settings } from "luxon";
Settings.defaultLocale = "ar";
Settings.defaultOutputCalendar = "islamic";
В этом случае форматирование будет учитывать исламский календарь, если локаль поддерживает соответствующие настройки.
Settings.defaultOutputCalendar не влияет на:
defaultZone)Она влияет исключительно на визуальное представление даты.
Глобальная настройка может быть переопределена для конкретного объекта:
import { DateTime } from "luxon";
const dt = DateTime.now().reconfigure({
outputCalendar: "buddhist"
});
console.log(dt.toLocaleString(DateTime.DATE_FULL));
Такой подход позволяет комбинировать разные календарные системы в одном приложении без изменения глобального состояния.
Использование разных календарей важно в системах:
Например, в интерфейсе для пользователей Таиланда может быть уместен буддийский календарь:
import { Settings } from "luxon";
Settings.defaultOutputCalendar = "buddhist";
Некоторые форматы сильнее зависят от календаря:
DATE_FULL)year)При этом низкоуровневые форматы (ISO):
toISO()toUTC()не зависят от календаря вообще, так как работают с абсолютным временем.
1. Ожидание изменения внутреннего времени
Календарь не изменяет timestamp:
const dt = DateTime.fromISO("2026-01-01");
Settings.defaultOutputCalendar = "islamic";
dt.toISO(); // останется прежним
2. Использование неподдерживаемого календаря
Если браузер или Node.js не поддерживает календарь через
Intl, настройка будет проигнорирована.
3. Смешение локали и календаря
Некоторые комбинации локали и календаря дают неожиданный формат, если регион не ожидает такой системы.
Поддержка календарей зависит от окружения:
Luxon не реализует календари самостоятельно, а полностью полагается
на Intl.DateTimeFormat.
Если Settings.defaultOutputCalendar не задан,
используется:
"gregory" как стандарт ICUЭто обеспечивает предсказуемость в большинстве приложений без дополнительной конфигурации.
При преобразовании DateTime в строковые представления
через локализацию:
year, month,
day могут отображаться иначе в зависимости от
календаряconst dt = DateTime.fromISO("2026-05-23");
Settings.defaultOutputCalendar = "chinese";
console.log(dt.toLocaleString(DateTime.DATE_FULL));
Settings.defaultOutputCalendar является частью
глобального конфигурационного слоя, который включает:
defaultLocaledefaultZonedefaultOutputCalendarЭти параметры формируют базовый контекст форматирования, на который
опираются все экземпляры DateTime, если не задано иное.
Изменение настройки после создания объектов:
const dt = DateTime.now();
Settings.defaultOutputCalendar = "hebrew";
console.log(dt.toLocaleString(DateTime.DATE_FULL));
влияет только на последующее форматирование, но не на сам объект.
В приложениях с динамической локализацией часто используется переключение календаря вместе с локалью:
Settings.defaultLocale = "th";
Settings.defaultOutputCalendar = "buddhist";
или
Settings.defaultLocale = "ja";
Settings.defaultOutputCalendar = "japanese";
Это позволяет согласовать отображение даты с культурными ожиданиями пользователя.
Luxon передаёт календарь в Intl.DateTimeFormat:
new Intl.DateTimeFormat("en-US-u-ca-buddhist", {
year: "numeric",
month: "long",
day: "numeric"
});
defaultOutputCalendar фактически влияет на параметр
ca (calendar extension) в Unicode locale identifier.
Некоторые календари имеют отличную систему летоисчисления, что приводит к:
Однако Luxon сохраняет исходную временную точку без изменений, гарантируя корректность вычислений при любых преобразованиях.