Когато съхранявате timestamp with time zone
(timestamptz
) се преобразува в UTC за съхранение в DB. Когато бъде извлечен, той се преобразува в текущата часова зона на клиента, а не в часовата зона, в която е бил първоначално. По принцип това е момент във времето.
Има също timestamp without time zone
(timestamp
). Това не подлежи на преобразуване, но не носете клеймо за време със себе си. Ако съхраните timestamp
с часовата зона на клиента, зададена на UTC, след това го извлечете, когато часовата зона на клиента е „+08:00“, получавате същата стойност. Това е половината от това, което искате, тъй като запазва стойността на необработеното време.
Имената и поведението са ужасни и объркващи, но определени от SQL стандарта.
Трябва да съхраните часовата зона отделно, ако искате да запишете момент от време в определена часова зона. Бих препоръчал да го съхранявате като INTERVAL
с CHECK
ограничение, което го ограничава да бъде colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR
. Тази дефиниция отхвърля -12:00 и приема +12:00; Не съм напълно сигурен, че е правилно, така че проверете.
Можете или да съхраните timestamp
местно време в тази часова зона (което вероятно бих направил), или да запазя timestamptz
от UTC времето, когато е настъпило събитието, плюс отместване, което ви позволява да го конвертирате в местно време.
И двете ще работят добре за JDBC. За JPA ще зависи от това колко добре вашият доставчик разбира и картографира типовете интервали. В идеалния случай искате преходно генерирано поле във вашия обект, което реконструира екземпляра на Календар, който искате, като използва timestamp
и interval
съхранявани в базата данни.