toJSONМетод toJSON() в объектах Luxon используется для
преобразования экземпляра даты и времени в строку формата ISO 8601,
пригодную для сериализации в JSON. Он является частью механизма
интеграции с JSON.stringify, который автоматически вызывает
этот метод, если он определён у объекта.
Основная роль метода заключается в обеспечении корректного и предсказуемого представления даты при сериализации:
DateTime в строкуtoJSONВ Luxon метод toJSON() для DateTime
возвращает строку, эквивалентную результату toISO():
YYYY-MM-DDTHH:mm:ss.sss±HH:mm или
ZnullПример базового поведения:
import { DateTime } from "luxon";
const dt = DateTime.local(2026, 5, 23, 14, 30);
console.log(dt.toJSON());
Результат будет примерно таким:
2026-05-23T14:30:00.000+03:00
JSON.stringifyКлючевая особенность toJSON() заключается в его
автоматическом вызове при сериализации объекта.
import { DateTime } from "luxon";
const obj = {
createdAt: DateTime.local(2026, 5, 23, 14, 30)
};
console.log(JSON.stringify(obj));
Результат:
{"createdAt":"2026-05-23T14:30:00.000+03:00"}
Таким образом:
DateTime не сериализуется как сложный объектtoJSON от
toISOХотя результаты методов часто совпадают, их назначение различается:
| Метод | Назначение | Результат |
|---|---|---|
toISO() |
явное получение ISO-строки | строка ISO |
toJSON() |
сериализация для JSON | строка ISO или null |
Особенности:
toJSON() — адаптер для JSON-экосистемыtoISO() — основной метод форматирования датыПример эквивалентности:
dt.toJSON() === dt.toISO();
Luxon сохраняет информацию о временной зоне в строке, если она
присутствует в объекте DateTime.
import { DateTime } from "luxon";
const dt = DateTime.now().setZone("Europe/Moscow");
console.log(dt.toJSON());
Пример результата:
2026-05-23T14:30:00.000+03:00
Особенности:
+03:00ZЕсли объект создан или преобразован в UTC, результат
toJSON() будет содержать Z:
import { DateTime } from "luxon";
const dt = DateTime.utc(2026, 5, 23, 14, 30);
console.log(dt.toJSON());
Результат:
2026-05-23T14:30:00.000Z
Суффикс Z означает нулевое смещение относительно
UTC.
Luxon строго отслеживает валидность DateTime. Если
объект невалиден, toJSON() возвращает
null.
import { DateTime } from "luxon";
const dt = DateTime.fromObject({ year: 99999 });
console.log(dt.isValid); // false
console.log(dt.toJSON()); // null
Семантика:
Метод сохраняет миллисекунды в итоговой строке:
import { DateTime } from "luxon";
const dt = DateTime.local(2026, 5, 23, 14, 30, 10, 123);
console.log(dt.toJSON());
Результат:
2026-05-23T14:30:10.123+03:00
Особенности:
При работе с вложенными объектами toJSON() обеспечивает
корректную сериализацию без дополнительных преобразований.
import { DateTime } from "luxon";
const event = {
name: "Meeting",
schedule: {
start: DateTime.local(2026, 5, 23, 10, 0),
end: DateTime.local(2026, 5, 23, 11, 0)
}
};
console.log(JSON.stringify(event));
Результат:
{
"name": "Meeting",
"schedule": {
"start": "2026-05-23T10:00:00.000+03:00",
"end": "2026-05-23T11:00:00.000+03:00"
}
}
Строка, полученная через toJSON(), может быть
восстановлена обратно в DateTime через парсинг ISO:
import { DateTime } from "luxon";
const json = DateTime.local().toJSON();
const restored = DateTime.fromISO(json);
Свойства:
На результат toJSON() влияют:
local, utc,
fromISO, fromObject)Не влияют напрямую:
toFormat)Метод toJSON() фактически делает DateTime
совместимым с типичными сценариями:
Основной принцип:
DateTimeDateСтандартный Date в JavaScript тоже имеет
toJSON(), но Luxon расширяет поведение:
| Тип | Формат |
|---|---|
Date |
UTC ISO строка |
DateTime (Luxon) |
ISO строка с учётом зоны |
Пример:
new Date().toJSON();
DateTime.local().toJSON();
Luxon даёт более контролируемый результат благодаря явной работе с временными зонами.
Метод используется в цепочках сериализации без явного вызова:
const payload = JSON.stringify({
created: DateTime.now()
});
Промежуточный механизм:
JSON.stringify вызывает toJSONtoJSON возвращает ISO-строкуЕсли объект оборачивается или расширяется, toJSON()
сохраняет приоритет при сериализации:
class Wrapper {
constructor(dt) {
this.dt = dt;
}
toJSON() {
return this.dt.toJSON();
}
}
Это позволяет: