Библиотека Luxon активно использует стандарт ISO 8601 как основной способ представления даты и времени. Этот формат универсален, поддерживается браузерами, серверными платформами, API и базами данных.
Типичная ISO-строка:
2025-03-15T14:30:00
Структура:
| Часть | Значение |
|---|---|
2025 |
год |
03 |
месяц |
15 |
день |
T |
разделитель даты и времени |
14:30:00 |
часы, минуты, секунды |
ISO 8601 поддерживает:
В Luxon ISO является наиболее удобным способом создания объектов времени.
DateTime.fromISO()Основной метод создания даты из ISO-строки:
DateTime.fromISO(isoString)
Пример:
import { DateTime } from "luxon";
const dt = DateTime.fromISO("2025-03-15T14:30:00");
console.log(dt.toString());
Результат:
2025-03-15T14:30:00.000+03:00
Метод возвращает объект DateTime.
ISO может содержать только календарную дату:
const dt = DateTime.fromISO("2025-03-15");
console.log(dt.toISO());
Результат:
2025-03-15T00:00:00.000+03:00
Если время отсутствует:
00;Полная ISO-строка:
const dt = DateTime.fromISO("2025-03-15T18:45:10");
Доступ к компонентам:
console.log(dt.year);
console.log(dt.month);
console.log(dt.day);
console.log(dt.hour);
console.log(dt.minute);
console.log(dt.second);
ISO поддерживает дробную часть секунд:
const dt = DateTime.fromISO(
"2025-03-15T18:45:10.125"
);
console.log(dt.millisecond);
Результат:
125
Символ Z означает UTC-время:
const dt = DateTime.fromISO(
"2025-03-15T18:45:10Z"
);
console.log(dt.zoneName);
Результат:
UTC
Такой формат особенно важен:
Строка может содержать offset:
const dt = DateTime.fromISO(
"2025-03-15T18:45:10+02:00"
);
console.log(dt.offset);
Результат:
120
Значение offset хранится в минутах.
Z и
+03:002025-03-15T10:00:00Z
Абсолютное время UTC.
2025-03-15T10:00:00+03:00
Локальное время со смещением.
Luxon корректно интерпретирует оба варианта.
setZoneПо умолчанию Luxon преобразует дату в локальную временную зону системы.
Пример:
const dt = DateTime.fromISO(
"2025-03-15T10:00:00+02:00"
);
console.log(dt.zoneName);
Если требуется сохранить оригинальную зону:
const dt = DateTime.fromISO(
"2025-03-15T10:00:00+02:00",
{ setZone: true }
);
console.log(dt.zoneName);
setZoneconst dt = DateTime.fromISO(
"2025-03-15T10:00:00+02:00"
);
Luxon:
Это может изменить отображаемые часы.
setZone: trueconst dt = DateTime.fromISO(
"2025-03-15T10:00:00+02:00",
{ setZone: true }
);
Теперь:
zoneОпция zone позволяет принудительно установить часовую
зону.
const dt = DateTime.fromISO(
"2025-03-15T10:00:00",
{ zone: "UTC" }
);
console.log(dt.toString());
zone| Значение | Описание |
|---|---|
UTC |
всемирное время |
Europe/Moscow |
Москва |
Asia/Almaty |
Алматы |
America/New_York |
Нью-Йорк |
local |
локальная зона |
ISO допускает отдельное время:
const dt = DateTime.fromISO("10:30:15");
Luxon автоматически подставит текущую дату.
ISO поддерживает week date:
const dt = DateTime.fromISO("2025-W12-6");
console.log(dt.toISODate());
Здесь:
W12 — 12 неделя года;6 — шестой день недели.Поддерживается ordinal формат:
const dt = DateTime.fromISO("2025-074");
Где:
074 — 74-й день года.Некорректная строка создаёт невалидный объект.
Пример:
const dt = DateTime.fromISO("invalid");
console.log(dt.isValid);
Результат:
false
console.log(dt.invalidReason);
console.log(dt.invalidExplanation);
Пример результата:
unparsable
the input could not be parsed
Практика безопасной работы:
const dt = DateTime.fromISO(userInput);
if (dt.isValid) {
console.log(dt.toISO());
} else {
console.log("Ошибка даты");
}
Частая ситуация:
const formValue = "2025-03-15";
const dt = DateTime.fromISO(formValue);
Особенно удобно при работе с:
<input type="date">;Серверы часто возвращают ISO:
{
"createdAt": "2025-03-15T10:20:30Z"
}
Использование:
const created = DateTime.fromISO(data.createdAt);
После парсинга доступны все методы Luxon.
dt.toFormat("dd.MM.yyyy")
dt.setZone("UTC")
dt.plus({ days: 5 })
dt.minus({ hours: 2 })
const result = DateTime
.fromISO("2025-03-15T10:00:00")
.plus({ days: 1 })
.setZone("UTC")
.toFormat("yyyy-MM-dd HH:mm");
const a = DateTime.fromISO("2025-03-15");
const b = DateTime.fromISO("2025-03-20");
console.log(a < b);
Лучше использовать:
console.log(a.toMillis() < b.toMillis());
const dt = DateTime.fromISO(
"2025-03-15T10:00:00"
);
const jsDate = dt.toJSDate();
const dt = DateTime.fromISO(
"2025-03-15T10:00:00"
);
console.log(dt.toISO());
Luxon понимает:
2025
2025-03
2025-03-15
2025-03-15T10
2025-03-15T10:30
2025-03-15T10:30:20
const dt = DateTime.fromISO(
"2025-03-15T10:00"
);
Без зоны Luxon считает время локальным.
Ошибка:
DateTime.fromISO(
"2025-03-15T10:00:00Z"
);
Без понимания UTC можно получить:
Наиболее безопасный подход:
Пример:
const utcDate = DateTime.utc();
const iso = utcDate.toISO();
fetch("/api", {
method: "POST",
body: JSON.stringify({
createdAt: DateTime.now().toISO()
})
});
const dt = DateTime.fromISO(
response.createdAt
);
const dates = [
"2025-03-15",
"2025-03-16",
"2025-03-17"
];
const parsed = dates.map(date =>
DateTime.fromISO(date)
);
parsed.sort(
(a, b) => a.toMillis() - b.toMillis()
);
const validDates = parsed.filter(
dt => dt.isValid
);
15-03-2025
Это не ISO.
Правильно:
2025-03-15
TНекоторые строки:
2025-03-15 10:00:00
могут работать нестабильно в разных окружениях.
Предпочтительно:
2025-03-15T10:00:00
2025-03-15T10:00:00Z
и
2025-03-15T10:00:00
— это разные значения времени.
fromISO() оптимизирован для ISO-формата и работает
быстрее многих универсальных парсеров.
Поэтому:
fromISO() предпочтительнее ручного парсинга;fromISO()
и fromFormat()fromISO()DateTime.fromISO("2025-03-15")
Используется для стандартных ISO-строк.
fromFormat()DateTime.fromFormat(
"15.03.2025",
"dd.MM.yyyy"
);
Используется для нестандартных форматов.
fromISO()Метод особенно полезен при работе с:
import { DateTime } from "luxon";
const source = "2025-03-15T10:30:00Z";
const dt = DateTime.fromISO(source);
if (!dt.isValid) {
throw new Error(dt.invalidExplanation);
}
const result = dt
.setZone("Asia/Almaty")
.plus({ days: 3 })
.toFormat("dd.MM.yyyy HH:mm");
console.log(result);