将实体插入数据库时​​不是本地主机日期时间而是数据库日期时间

Not localhost datetime but database datetime while inserting entity to database

我无法将新记录插入我的 PostgreSQL 数据库。我正在使用 Spring Boot with Spring Data JPA 和 Hibernate。我正在连接到外部数据库。此服务器上的时间与我的本地主机上的时间不同。当我将一个新实体插入到数据库中时,该记录插入的日期和时间来自我的本地主机,而不是来自数据库服务器。我知道我可以在 application.properties 中设置日期时区,但是如果我更改数据库连接 URL 我可能不知道数据库服务器上设置的时间。我知道我可以在保存之前从数据库中获取 now() 时间,但我确信还有另一种解决方案。感谢您的帮助。

处理这种情况最好的方法是在PostgreSQL中使用数据类型timestamp with time zone。然后时间戳存储为 绝对时间 ,独立于时区(我知道这与数据类型的名称相矛盾)。然后您需要做的就是在每个数据库会话中将数据库参数 timezone 设置为正确的客户端时区。

假设数据库服务器在纽约,但我们在加尔各答:

CREATE TABLE tstest (
   id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
   t timestamp with time zone NOT NULL
);

SET timezone = 'Asia/Kolkata';

INSERT INTO tstest (t) VALUES (current_timestamp);

SELECT * FROM tstest;

 id │                t                 
════╪══════════════════════════════════
  1 │ 2022-02-23 14:00:19.555188+05:30
(1 row)

现在洛杉矶有人访问了数据:

SET timezone = 'America/Los_Angeles';

SELECT * FROM tstest;

 id │               t               
════╪═══════════════════════════════
  1 │ 2022-02-23 00:30:19.555188-08
(1 row)

所以每个人都能看到正确的时间戳,与服务器所在的位置无关。