gpt4 book ai didi

java - 如何在 h2 db 中存储 LocalDateTime?

转载 作者:行者123 更新时间:2023-12-02 01:26:15 30 4
gpt4 key购买 nike

在 h2 数据库中存储 LocalDate 实例的正确方法是什么?

我正在使用数据类型TIMESTAMP,但根据启动的user.timezone java进程,出现了奇怪的行为。

当我插入带有美国/多伦多时区的 TIMESTAMP 并使用时区 UTC 读回它时,2021-05-01 会有 1 小时的差异,但是不适用于 2021-01-01

重现步骤

确保当前文件夹中有 h2-1.4.196.jar。启动 h2 控制台:

java -Duser.timezone=America/Toronto -cp h2*.jar org.h2.tools.Console

对于我正在使用的 JDBC URL,我认为并非所有内容都相关,但 MV_STORE=FALSEMVCC=FALSE 应该很重要。

jdbc:h2:~/mydb;DATABASE_TO_UPPER=FALSE;DB_CLOSE_DELAY=-1;LOCK_TIMEOUT=60000;CACHE_SIZE=16384;AUTO_SERVER=TRUE;MV_STORE=FALSE;MVCC=FALSE

运行以下查询来创建新表:

CREATE TABLE foo (  
time TIMESTAMP NULL,
);

插入两行:

INSERT INTO foo VALUES (TIMESTAMP '2021-05-01 00:00:00.0')
INSERT INTO foo VALUES (TIMESTAMP '2021-01-01 00:00:00.0')

验证您是否成功插入数据,返回:

SELECT * FROM foo;
time
2021-05-01 00:00:00.0
2021-01-01 00:00:00.0

现在停止您启动的 java 进程,这次使用以下命令运行它,请注意 user.timezone 是不同的:

java -Duser.timezone=UTC -cp h2*.jar org.h2.tools.Console 

使用上面相同的 URL 进行连接并运行上面相同的 SELECT 查询。 仅针对第一个条目观察结果中的小时差异。

SELECT * FROM foo;
time
2021-04-30 23:00:00.0
2021-01-01 00:00:00.0

最佳答案

2021 年 3 月 28 日凌晨 02:00,部分国家/地区的时间已转发至凌晨 03:00。这是世界上许多国家实行的人工夏令时(顺便说一句,公平地说,这是现任土耳其总统的一项成就,土耳其[现在的土耳其]不再玩弄尖齿了——我认为这是他唯一的成就)。结果,01.05.2021 00:00 实际上是 30.04.2021 23:00(顺便说一句,这两天都是越南的国定假日,1975 年 4 月 30 日标志着那场毫无意义的越南 war 的结束 - 越南从来没有玩过时间)。

多伦多实行夏令时。

我想,H2 忽略了 user.timezone。但也不完全是这样。根据 xerx593 的评论,我同意,这是一个错误。

废除夏令时: https://twitter.com/VitalikButerin?s=20&t=FiPQedQk0YY1ywzPPA6VlA

关于java - 如何在 h2 db 中存储 LocalDateTime?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74565134/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com