将实体插入数据库时不是本地主机日期时间而是数据库日期时间
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)
所以每个人都能看到正确的时间戳,与服务器所在的位置无关。
我无法将新记录插入我的 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)
所以每个人都能看到正确的时间戳,与服务器所在的位置无关。