Java 地理位置分散的服务器、PostgreSQL和JPA
我的数据库服务器的时区是UTC。我在不同的时区有Java服务器,可以与数据库交互。我天真地发现,如果我有一个TIMESTAMP字段,那么我真的无法从Java服务器的JPA代码中将其设置为UTC。我猜我天真地认为,如果JDBC总是发送带有TZ信息的日期,那么数据库服务器可以根据时区适当地进行输入或输出转换。但编号:( 问题就在这里。我可能有不同时区的Java服务器与这个数据库服务器交互。如果东海岸晚上9点和西海岸下午6点发生了什么事情,我希望这两个事件同时存储在数据库中。嗯,对吗 那么解决方案是什么呢?我想我可以把我所有的Java服务器都放在UTC。但是似乎应该有一个不那么繁重的解决方案。我想我也可以在每个事务上设置时区,但是呃Java 地理位置分散的服务器、PostgreSQL和JPA,java,postgresql,jpa,Java,Postgresql,Jpa,我的数据库服务器的时区是UTC。我在不同的时区有Java服务器,可以与数据库交互。我天真地发现,如果我有一个TIMESTAMP字段,那么我真的无法从Java服务器的JPA代码中将其设置为UTC。我猜我天真地认为,如果JDBC总是发送带有TZ信息的日期,那么数据库服务器可以根据时区适当地进行输入或输出转换。但编号:( 问题就在这里。我可能有不同时区的Java服务器与这个数据库服务器交互。如果东海岸晚上9点和西海岸下午6点发生了什么事情,我希望这两个事件同时存储在数据库中。嗯,对吗 那么解决方案是什
我知道我会得到一些答案,说我应该只在数据库中存储long,虽然我很欣赏这个答案的准确性,但我确实希望在数据库表中保留时区和日期字段。因此我正在寻找其他类型的答案。谢谢。解决方案是在时间上为这些瞬间使用TIMESTAMPTZ字段。例如“用户创建的时间”不应该被存储在一个时间戳字段中,默认情况下它不保存TZ信息。JDBC驱动程序处理这些非常随意。例如,考虑以下内容: 假设您的JVM位于美国/洛杉矶地区,而您的数据库服务器位于UTC 然后创建下表:
CREATE TABLE test (
id INTEGER,
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
tswz TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
如果您从PSQL发布:
INSERT INTO test(id) values(1);
“ts”和“tswz”的值相同。两者都是当前UTC时间。但是,如果使用JDBC驱动程序从Java执行相同的精确查询,则“ts”将是洛杉矶的当前时间,“tswz”将是UTC时间
我不知道在这种情况下,驱动程序是如何向服务器传递JVM时区的,因为我们在服务器上设置了默认的字段。他们说他们没有为会话设置时区,但他们必须这样做。无论哪种方式,如果您使用TIMESTAMPTZ字段,那么您将从任何JVM获得相同的实例,而不管它恰好位于哪个时区。不要忘了使用NTPI同步时钟。我想你想要的是
时间戳和时区
,而不是时间戳
。如果你也想保留时区/偏移量,你必须单独存储它-在这方面,时间戳和时区
类型的命名是相当欺骗性的。感谢SQL标准。这将如何使postgres服务器是否以UTC运行存在差异?