Yaroslav Schekin
> Я не хочу использовать timestamptz
А зря не хотите. Дело в том, что timestamptz в PostgreSQL — это default type для этой категории типов, естественно.
Поэтому все преобразования и функции по умолчанию "тянет" в эту сторону. Т.е. обходиться без него можно, но ни разу не ошибиться (и эти ошибки будут совсем не очевидны!) не так-то просто.
> т.к. провайдер БД для приложения будет отдавать его как ZonedDateTime с зоной текущего подключения
Хмм... то есть? Что это за тип в postgres-овских терминах? Или, если это текст, как выглядят эти константы?
> А я хотел бы, чтобы семантика колонки была одной и той же - момент абсолютного времени (Instant),
И это как раз timestamptz!
> что время - уже в нужной таймзоне
В нормальных клиентах наличие части вроде "+07" в конце каждого значения толсто намекает, что это timestamptz. ;)
> но эту цену я готов взять
А заплатить можете ещё и другую — ошибками.
1. Навскидку из того, что смог придумать, нигде не ошибся, файл прилагаю следующим сообщением - это слишком длинное для комментария к файлу.
2. У меня тут фактическая ошибка, и можно маппить и в Instant (посмотрел сорцы).
Отвечая на вопросы: ZonedDateTime (в Java (вроде) 5+ версии и в .NET с библиотекой NodaTime) - timestamptz (в вашем определении - "абсолютное время") + timezone, где timezone может быть идентификатором из tzdb (могут быть другие источники, но они мне не интересны). Провайдер маппит его, используя таймзону соединения, что не будет очевидно тем, кто не знает, как в ПГ работают таймзоны. Instant - более подходящий вариант, т.к. он представляет timestamptz (в том же определении) без указания таймзоны.
3. В связи с фактической ошибкой выше - согласен с вами. Если бы не она, то маппинг во время с бесполезной таймзоной на стороне провайдера делал бы семантику неконсистентной (провайдер говорит, что таймзона есть, по факту - её нет)
4. Не соглашусь, что нормальные клиенты будут использовать текстовый протокол. В бинарном, насколько я знаю, указания на этот оффсет нет; по крайней мере в рассматриваемом провайдере читаемое значение используется как utc-шное время (я не изучал протоколы ПГ)
5. Можете привести пример какой-нибудь интересной грабли, ради научного интереса?
Исходя из того что провайдер позволяет маппить timestamptz в Instant, буду использовать timestamptz - так и семантика будет консистентна, и, наверное, ошибок будет меньше (сейчас опробую тот же файл на timestamptz)