Какую информацию о часовом поясе хранит PostgreSQL? - PullRequest
0 голосов
/ 08 февраля 2019

Документация PostgreSQL довольно полная и полезная:

https://www.postgresql.org/docs/9.2/datatype-datetime.html#DATATYPE-TIMEZONES

, но, похоже, упускает ясность из довольно полезного момента, когда ясность может быть оправдана и полезна.Прочитав документацию и различные связанные вопросы и ответы о стековом потоке, я подозреваю, что верно следующее:

Тип данных PostgreSQL timestamp with timezone хранит дату и время, а также значение utcoffset (+ ve is eastиз Гринвича)

Я бы также сделал вывод и подозреваю, что это правда:

Тип данных PostgreSQL timestamp with timezone хранит дату и время, а также смещение utcoff (к востоку от Гринвича) до минутного разрешения.

Мой вопрос касается этих выводов.Правильны ли они, и если да, то какие доказательства могут быть направлены для их подтверждения, а если нет, то какие доказательства могут быть направлены на обратное?

Основная причина, по которой это интересно, состоит в том, что, конечно, если это правда, то PostgreSQL, которыйпринимает часовые пояса по имени или аббревиатуре, которые хранятся в таблице. pg_timezone_names сохраняет только смещение UTC и, таким образом, теряет информацию о летнем времени.

Значение, означающее фактическое имя часового пояса (как определено в таблице pg_timezone_names).доступный читателю в будущем, он должен быть явно сохранен рядом с timestamp with timezone в столбце рядом с ним.

Основная причина, которая меня сейчас интересует, состоит в том, что я имел в виду то, что я чувствовал, был достаточно умнымспособ рендеринга времени, которое может записывать время события в любой точке земного шара.А именно, если записанное время находится в текущем часовом поясе пользователей, то сообщите об этом как наивную дату / время (без информации о часовом поясе), и только если оно находится в часовом поясе, отличном от читателей, сообщите информацию о часовом поясе (и даже тогда,название часового пояса может быть более удобным для пользователя, чем смещение UTC).

И, похоже, я буду обязан хранить имя часового пояса помимо времени моего события (и любой другой даты / времени, которые я храню в часовом поясе), если я хочу реализовать такой контекстно-зависимый рендеринг на веб-сайте.

Но я чувствую себя неловко, принимая такое обязательство на основе умозаключений, а не знаний, и хотел бы получить какие-либо доказательства, подтверждающие или противоречащие этим умозаключениям.

1 Ответ

0 голосов
/ 08 февраля 2019

Оба ваших предположения неверны:

PostgreSQL хранит timestamp with time zone как 8-байтовое целое число, которое содержит смещение от 2000-01-01 00:00:00 UTC в микросекундах.

Так что он также не сохраняет часовой пояс, и точность не равна 1 минуте.

При преобразовании в строку отметка времени форматируется в соответствии с текущей настройкой параметра timezone.

Поэтому, если вам нужно сохранить времяЗону отдельно, если вам нужно запомнить ее и использовать выражение AT TIME ZONE для преобразования метки времени в соответствующий часовой пояс.

Вы запрашиваете ссылки на документацию.Частично это здесь :

/*
 * Timestamp represents absolute time.
[...]
 * Timestamps, as well as the h/m/s fields of intervals, are stored as
 * int64 values with units of microseconds.  (Once upon a time they were
 * double values with units of seconds.)

В том же файле вы найдете

/* Julian-date equivalents of Day 0 in Unix and Postgres reckoning */
#define UNIX_EPOCH_JDATE        2440588 /* == date2j(1970, 1, 1) */
#define POSTGRES_EPOCH_JDATE    2451545 /* == date2j(2000, 1, 1) */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...