Разделители

Форматирование даты и времени в библиотеке Luxon строится на шаблонах, состоящих из специальных токенов. Между токенами размещаются разделители — символы, строки и конструкции, определяющие внешний вид итоговой даты.

Разделители используются практически во всех сценариях:

  • отображение дат в интерфейсе;
  • генерация строк для API;
  • экспорт данных;
  • логирование;
  • локализованные форматы;
  • ISO-совместимые строки;
  • пользовательские шаблоны.

Простейшие разделители

Наиболее распространённые разделители:

Разделитель Назначение Пример
/ разделение даты 10/03/2026
- ISO-формат 2026-03-10
. европейский формат 10.03.2026
: разделение времени 14:30:45
(пробел) разделение частей 2026-03-10 14:30
, разделение даты и времени March 10, 2026

Пример:

import { DateTime } from "luxon";

const dt = DateTime.now();

console.log(dt.toFormat("dd.MM.yyyy"));
console.log(dt.toFormat("yyyy-MM-dd"));
console.log(dt.toFormat("HH:mm:ss"));

Результат:

10.03.2026
2026-03-10
14:30:45

Разделители внутри toFormat()

Метод toFormat() позволяет строить строку вручную.

Шаблон:

DateTime.now().toFormat("dd/MM/yyyy");

Здесь:

  • dd — день;
  • / — разделитель;
  • MM — месяц;
  • / — второй разделитель;
  • yyyy — год.

Luxon не ограничивает набор разделителей. Между токенами допускаются любые символы.


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

Дефис особенно важен при работе с ISO-совместимыми строками.

Пример:

const dt = DateTime.now();

console.log(dt.toFormat("yyyy-MM-dd"));

Результат:

2026-03-10

Такой формат часто используется:

  • в базах данных;
  • REST API;
  • JSON;
  • URL;
  • системах логирования.

Использование точки

Точка характерна для европейских форматов даты.

const dt = DateTime.now();

console.log(dt.toFormat("dd.MM.yyyy"));

Результат:

10.03.2026

Формат активно применяется:

  • в документах;
  • отчётах;
  • бухгалтерских системах;
  • интерфейсах СНГ и Европы.

Использование косой черты

Слэш распространён в американских и международных интерфейсах.

console.log(
  DateTime.now().toFormat("MM/dd/yyyy")
);

Результат:

03/10/2026

Разделители времени

Для времени чаще всего используется двоеточие.

console.log(
  DateTime.now().toFormat("HH:mm:ss")
);

Результат:

14:35:20

Структура:

Токен Значение
HH часы
: разделитель
mm минуты
: разделитель
ss секунды

Составные разделители

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

Пример:

console.log(
  DateTime.now().toFormat("dd-MM-yyyy HH:mm")
);

Результат:

10-03-2026 14:35

Используются:

  • дефис;
  • пробел;
  • двоеточие.

Текстовые разделители

В шаблонах допускается обычный текст.

console.log(
  DateTime.now().toFormat("dd MMMM yyyy year")
);

Результат:

10 March 2026 year

Однако здесь появляется важная особенность Luxon.


Экранирование текста

Luxon воспринимает многие символы как токены форматирования. Чтобы вставить обычный текст, используются одинарные кавычки.

Правильный вариант:

console.log(
  DateTime.now().toFormat("dd MMMM yyyy 'year'")
);

Результат:

10 March 2026 year

Без экранирования часть символов может интерпретироваться как команды форматирования.


Использование запятой

Запятая часто применяется между датой и временем.

console.log(
  DateTime.now().toFormat("MMMM dd, yyyy")
);

Результат:

March 10, 2026

Комбинирование нескольких разделителей

Luxon позволяет свободно комбинировать символы.

console.log(
  DateTime.now().toFormat("dd.MM.yyyy | HH:mm:ss")
);

Результат:

10.03.2026 | 14:40:12

Разделителем здесь выступает строка:

 | 

Пользовательские разделители

В качестве разделителя может использоваться практически любой набор символов.

Пример:

console.log(
  DateTime.now().toFormat("dd=>MM=>yyyy")
);

Результат:

10=>03=>2026

Unicode-разделители

Luxon корректно работает с Unicode-символами.

console.log(
  DateTime.now().toFormat("dd • MM • yyyy")
);

Результат:

10 • 03 • 2026

Другой пример:

console.log(
  DateTime.now().toFormat("HH ч mm мин")
);

Результат:

14 ч 45 мин

Разделители и локализация

Разделители можно задавать вручную либо доверить локали.

Пример локализованного формата:

const dt = DateTime.now().setLocale("ru");

console.log(dt.toLocaleString(DateTime.DATE_FULL));

Результат:

10 марта 2026 г.

Здесь разделители определяются самой локалью.


Разница между toFormat() и toLocaleString()

toFormat()

Полный ручной контроль:

dt.toFormat("dd.MM.yyyy HH:mm")

toLocaleString()

Автоматические разделители:

dt.toLocaleString(DateTime.DATETIME_SHORT)

Разделители ISO-форматов

Luxon умеет генерировать ISO-строки автоматически.

const dt = DateTime.now();

console.log(dt.toISO());

Результат:

2026-03-10T14:50:22.000+03:00

Используемые разделители:

Символ Назначение
- разделение даты
T разделение даты и времени
: разделение времени
. миллисекунды
+ смещение timezone

Символ T как разделитель

В ISO-формате символ T отделяет дату от времени.

2026-03-10T14:50:22

Пример ручного шаблона:

dt.toFormat("yyyy-MM-dd'T'HH:mm:ss")

Кавычки обязательны, иначе T может интерпретироваться как токен.


Разделители миллисекунд

console.log(
  DateTime.now().toFormat("HH:mm:ss.SSS")
);

Результат:

14:55:20.123

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


Разделители timezone

Пример:

console.log(
  DateTime.now().toFormat("HH:mm:ss ZZZ")
);

Результат:

14:55:20 +0300

Пробел разделяет время и часовой пояс.


Вложенные текстовые разделители

Luxon позволяет создавать сложные шаблоны.

console.log(
  DateTime.now().toFormat(
    "dd 'days,' HH 'hours and' mm 'minutes'"
  )
);

Результат:

10 days, 14 hours and 25 minutes

Разделители в логировании

Логи часто требуют компактного формата.

const timestamp = DateTime.now()
  .toFormat("yyyy-MM-dd HH:mm:ss");

console.log(`[${timestamp}] Server started`);

Результат:

[2026-03-10 15:00:10] Server started

Разделители в файловых именах

Некоторые символы недопустимы в именах файлов.

Проблемный вариант:

15:20:10

Безопасный вариант:

const fileDate = DateTime.now()
  .toFormat("yyyy-MM-dd_HH-mm-ss");

Результат:

2026-03-10_15-20-10

Разделители и парсинг

Шаблон при парсинге должен совпадать со строкой.

Пример:

const dt = DateTime.fromFormat(
  "10.03.2026",
  "dd.MM.yyyy"
);

Если разделители не совпадают:

DateTime.fromFormat(
  "10/03/2026",
  "dd.MM.yyyy"
);

парсинг завершится ошибкой.


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

const dt = DateTime.fromFormat(
  "10/03/2026",
  "dd.MM.yyyy"
);

console.log(dt.isValid);

Результат:

false

Экранирование кавычек

Если требуется вывести сам символ ', используется двойное экранирование.

Пример:

console.log(
  DateTime.now().toFormat("dd 'o''clock'")
);

Результат:

10 o'clock

Частые ошибки при работе с разделителями

Отсутствие экранирования текста

Ошибка:

dt.toFormat("dd MMMM year")

Правильно:

dt.toFormat("dd MMMM 'year'")

Неверный разделитель при парсинге

Ошибка:

DateTime.fromFormat(
  "2026/03/10",
  "yyyy-MM-dd"
);

Правильно:

DateTime.fromFormat(
  "2026/03/10",
  "yyyy/MM/dd"
);

Использование запрещённых символов в имени файла

Ошибка:

HH:mm:ss

Правильно:

HH-mm-ss

Практические шаблоны

Европейский формат

dd.MM.yyyy

Американский формат

MM/dd/yyyy

ISO

yyyy-MM-dd

Дата и время

yyyy-MM-dd HH:mm:ss

Для файлов

yyyy-MM-dd_HH-mm-ss

Логи

[yyyy-MM-dd HH:mm:ss]

Разделители в Duration

Разделители используются и при форматировании продолжительности.

import { Duration } from "luxon";

const duration = Duration.fromObject({
  hours: 2,
  minutes: 15,
  seconds: 30
});

console.log(
  duration.toFormat("hh:mm:ss")
);

Результат:

02:15:30

Разделители в интервалах

import { Interval, DateTime } from "luxon";

const start = DateTime.now();
const end = start.plus({ days: 5 });

const interval = Interval.fromDateTimes(start, end);

console.log(
  `${interval.start.toFormat("dd.MM.yyyy")} - ${interval.end.toFormat("dd.MM.yyyy")}`
);

Результат:

10.03.2026 - 15.03.2026

Символ - выступает разделителем диапазона дат.