Метод DateTime.fromSQL в библиотеке Luxon используется
для преобразования строкового представления даты и времени в формате SQL
(или близком к нему) в объект DateTime. Основное назначение
— работа с датами, полученными из SQL-баз данных, где стандартом
являются форматы YYYY-MM-DD и
YYYY-MM-DD HH:mm:ss, иногда с указанием часового пояса.
Метод обеспечивает строгий и предсказуемый парсинг, минимизируя
неоднозначности, характерные для встроенного
Date.parse.
DateTime.fromSQL(text, options)
text — строка в SQL-формате options — необязательный объект конфигурации
Метод корректно обрабатывает несколько распространённых вариантов:
YYYY-MM-DDYYYY-MM-DD HH:mmYYYY-MM-DD HH:mm:ssYYYY-MM-DD HH:mm:ss.SSSYYYY-MM-DDTHH:mm:ss (частично совместимый
ISO-вариант)YYYY-MM-DD HH:mm:ss Z или
YYYY-MM-DD HH:mm:ss±HH:mmПри разборе строки Luxon:
Если строка не соответствует SQL-подобному формату, возвращается
Invalid DateTime.
import { DateTime } from "luxon";
const dt = DateTime.fromSQL("2026-05-23 14:30:00");
Результат:
const dt = DateTime.fromSQL("2026-05-23");
В этом случае время устанавливается в 00:00:00.
Такая форма часто используется при работе с колонками типа
DATE в SQL.
const dt = DateTime.fromSQL("2026-05-23 14:30:00.125");
Миллисекунды сохраняются и доступны через:
dt.millisecond
SQL-строки могут содержать смещение:
const dt = DateTime.fromSQL("2026-05-23 14:30:00+03:00");
В этом случае Luxon:
+03:00Пример конвертации:
dt.setZone("UTC").toString();
Метод поддерживает дополнительную конфигурацию:
DateTime.fromSQL(text, {
zone,
setZone,
locale
})
Позволяет задать временную зону вручную:
DateTime.fromSQL("2026-05-23 14:30:00", {
zone: "Europe/Paris"
});
Если строка не содержит зоны, используется указанная.
Определяет, следует ли сохранять исходную зону строки:
DateTime.fromSQL("2026-05-23 14:30:00+02:00", {
setZone: true
});
true — сохраняет зону из строкиfalse — преобразует к зоне по умолчаниюПозволяет задать локаль объекта:
DateTime.fromSQL("2026-05-23 14:30:00", {
locale: "ru"
});
Локаль влияет на форматирование, но не на сам процесс парсинга.
fromSQL и fromISO часто используются в
схожих задачах, но имеют разные ожидания:
fromSQL ориентирован на пробельные разделители и
классические SQL-форматыfromISO требует строгого ISO 8601 с TПримеры различий:
DateTime.fromSQL("2026-05-23 14:30:00"); // корректно
DateTime.fromISO("2026-05-23 14:30:00"); // может быть некорректно
DateTime.fromISO("2026-05-23T14:30:00"); // корректно
DateTime.fromSQL("2026-05-23T14:30:00"); // тоже корректно, но менее строго
SQL-форматы часто возвращаются из:
Пример результата запроса:
SEL ECT created_at FR OM users;
-- "2026-05-23 14:30:00"
В Jav * aScript:
const createdAt = DateTime.fromSQL(row.created_at);
Частая ситуация — база хранит время без зоны:
2026-05-23 14:30:00
Luxon в этом случае интерпретирует значение как локальное. Это может приводить к смещениям при работе в распределённых системах.
Решение:
DateTime.fromSQL(value, {
zone: "UTC"
});
Если строка не соответствует SQL-формату:
const dt = DateTime.fromSQL("invalid date");
Результат:
dt.isValid === false
Проверка валидности обязательна при работе с внешними источниками данных.
В реальных системах часто встречаются вариации:
Пример устойчивой обработки:
const dt = DateTime.fromSQL(rawValue.trim());
DateTime.fromSQL("2026-05-23 14:30");
Luxon автоматически интерпретирует:
14:30:00
Локаль не влияет на разбор строки, но влияет на вывод:
const dt = DateTime.fromSQL("2026-05-23 14:30:00", {
locale: "fr"
});
dt.toLocaleString(DateTime.DATETIME_FULL);
После создания объекта доступны стандартные операции Luxon:
dt.toISO();
dt.toSQL();
dt.toMillis();
dt.toFormat("dd.MM.yyyy HH:mm");
Использование стандартного Date:
new Date("2026-05-23 14:30:00");
имеет неоднозначное поведение в разных окружениях.
Luxon через fromSQL:
Если строка содержит только дату:
DateTime.fromSQL("2026-05-23");
все временные поля устанавливаются в ноль:
Метод выполняет последовательность шагов:
DateTimeПри обработке API-ответов:
app.get("/users", (req, res) => {
const users = data.map(u => ({
...u,
createdAt: DateTime.fromSQL(u.created_at)
}));
});
При интеграции с ORM:
class User {
constructor(row) {
this.createdAt = DateTime.fromSQL(row.created_at);
}
}
Такой подход позволяет унифицировать работу с датами на уровне модели данных.
Основные источники проблем:
Пример проблемной строки:
2026/05/23 14:30:00
Она не будет распознана корректно без предварительной нормализации.
При работе с неизвестными источниками:
const dt = DateTime.fromSQL(value);
if (!dt.isValid) {
// fallback логика
}
fromSQL оптимизирован для массового парсинга строк и
обычно быстрее, чем универсальные парсеры, поскольку ожидает
ограниченный набор форматов и не выполняет сложный анализ строки.