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

标签 java datetime timestamp h2 localdatetime

在 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/

相关文章:

c# - 在 C# 中创建时间戳的函数

Oracle TIMESTAMP WITH TIMEZONE 命名区域与偏移量

java - 与访问 mysql 数据库中的相同数据相比,访问 java 列表(arraylist)是否更快?

java - 如何在不指定每一列的情况下将整行作为参数传递给 Spark (Java) 中的 UDF?

java - javamail API 中的 SMTP 身份验证问题

java - kundera-cassandra 使用 spring 时在 EntityManagerFactory 上设置 cql 版本

php - 你怎么匹配12小时时间 hh :mm in a regex?

Python - 日期时间时间始终为零

python - 如何在 Python Pandas 中处理由于夏令时而具有可变时区偏移的时间序列?

ios - 在iOS中将长格式的日期转换为NSDate?