Задать вопрос
@Andrey1302
FullStack Developer (React.js | Node.js | Nest.js)

Нужно ли сохранять таймзону в БД при создании колонки в таблице с помощью @CreateDateColumn()?

Использую TypeORM.

Я определяю дату создания записи с помощью:
@CreateDateColumn()
createdAt: Date;


В такой конфигурации createdAt сохраняется как timestamp without time zone (UTC). Однако я заметил, что можно явно указать тип timestamptz, чтобы сохранять дату с учётом таймзоны.

Вопрос:
Какой подход считается best practice в продакшене — использовать timestamp или timestamptz?

Пример проблемы:

@Column({ type: 'timestamp' })
  expiresAt: Date;


Допустим, я сохраняю значение колонки expiresAt вручную:

expiresAt = new Date(Date.now() + 30 * 60 * 1000); // +30 минут


new Date() создаёт объект с локальной таймзоной, а createdAt — в UTC. В результате в одной таблице появляются две даты с разной семантикой — это нарушает консистентность данных.

Итоговый вопрос:
Как правильно настроить работу с датами и таймзонами в TypeORM и PostgreSQL, чтобы избежать подобных несостыковок?
  • Вопрос задан
  • 43 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1

что можно явно указать тип timestamptz, чтобы сохранять дату с учётом таймзоны.

timestamptz не сохраняет таймзону. Он только требует при сохранении явно её указать, чтобы потом внутри привести её к utc. При чтении потом у времени будет стоять таймзона, которая настроена в клиенте.
(Выставляется через SET TIMEZONE)
https://www.postgresql.org/docs/current/sql-set.html
https://www.postgresql.org/docs/current/datatype-d...

Если твоему приложению нужно явно хранить таймзону (например ты делаешь какой-то календарь с событиями, которые привязаны к местному времени), то тебе нужно завести две колонки: одну со временем (timestamp without tz) и ещё одну колонку для таймзоны.

Если тебе нужно хранить просто конкретный момент времени, то тогда лучше использовать timestamptz.
На счёт того что при записи будет указываться разный часовой пояс - не бойся, оно всё равно автоматически будет приведено к utc
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы