Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 地理位置分散的服务器、PostgreSQL和JPA_Java_Postgresql_Jpa - Fatal编程技术网

Java 地理位置分散的服务器、PostgreSQL和JPA

Java 地理位置分散的服务器、PostgreSQL和JPA,java,postgresql,jpa,Java,Postgresql,Jpa,我的数据库服务器的时区是UTC。我在不同的时区有Java服务器,可以与数据库交互。我天真地发现,如果我有一个TIMESTAMP字段,那么我真的无法从Java服务器的JPA代码中将其设置为UTC。我猜我天真地认为,如果JDBC总是发送带有TZ信息的日期,那么数据库服务器可以根据时区适当地进行输入或输出转换。但编号:( 问题就在这里。我可能有不同时区的Java服务器与这个数据库服务器交互。如果东海岸晚上9点和西海岸下午6点发生了什么事情,我希望这两个事件同时存储在数据库中。嗯,对吗 那么解决方案是什

我的数据库服务器的时区是UTC。我在不同的时区有Java服务器,可以与数据库交互。我天真地发现,如果我有一个TIMESTAMP字段,那么我真的无法从Java服务器的JPA代码中将其设置为UTC。我猜我天真地认为,如果JDBC总是发送带有TZ信息的日期,那么数据库服务器可以根据时区适当地进行输入或输出转换。但编号:(

问题就在这里。我可能有不同时区的Java服务器与这个数据库服务器交互。如果东海岸晚上9点和西海岸下午6点发生了什么事情,我希望这两个事件同时存储在数据库中。嗯,对吗

那么解决方案是什么呢?我想我可以把我所有的Java服务器都放在UTC。但是似乎应该有一个不那么繁重的解决方案。我想我也可以在每个事务上设置时区,但是呃


我知道我会得到一些答案,说我应该只在数据库中存储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运行存在差异?