java.sql.Timestamp错误的时间解析

Pav*_*tou 5 java sql postgresql timestamp scala

有人可以解释为什么会这样吗?为什么那段时间有24分钟的补偿以及如何处理?

Scala 2.12和Java 8.

scala> java.sql.Timestamp.valueOf("1900-01-01 00:59:00")
res22: java.sql.Timestamp = 1900-01-01 00:59:00.0

scala> java.sql.Timestamp.valueOf("1900-01-01 01:00:00")
res23: java.sql.Timestamp = 1900-01-01 01:24:00.0

scala> java.sql.Timestamp.valueOf("1900-01-01 01:14:00")
res24: java.sql.Timestamp = 1900-01-01 01:38:00.0

scala> java.sql.Timestamp.valueOf("1900-01-01 01:20:00")
res25: java.sql.Timestamp = 1900-01-01 01:44:00.0

scala> java.sql.Timestamp.valueOf("1900-01-01 01:23:00")
res26: java.sql.Timestamp = 1900-01-01 01:47:00.0

scala> java.sql.Timestamp.valueOf("1900-01-01 01:24:00")
res27: java.sql.Timestamp = 1900-01-01 01:24:00.0

scala> java.sql.Timestamp.valueOf("1900-01-01 01:30:00")
res28: java.sql.Timestamp = 1900-01-01 01:30:00.0
Run Code Online (Sandbox Code Playgroud)

Lau*_*lbe 4

查看IANA时区数据库中的时区定义:

# Zone  NAME            GMTOFF  RULES   FORMAT  [UNTIL]
Zone    Europe/Warsaw   1:24:00 -       LMT     1880
                        1:24:00 -       WMT     1915 Aug  5 # Warsaw Mean Time
                        1:00    C-Eur   CE%sT   1918 Sep 16  3:00
                        2:00    Poland  EE%sT   1922 Jun
                        1:00    Poland  CE%sT   1940 Jun 23  2:00
                        1:00    C-Eur   CE%sT   1944 Oct
                        1:00    Poland  CE%sT   1977
                        1:00    W-Eur   CE%sT   1988
                        1:00    EU  CE%sT
Run Code Online (Sandbox Code Playgroud)

1900 年,波兰时区与 UTC 的时差为 1 小时 24 分钟,即他们使用当地平均太阳时。那是在 1915 年 8 月 5 日引入标准时区之前。

您必须向 PostgreSQL 提供 a timestamp without time zone,它会在您的本地时区(偏移量为 1:24)进行解释。

然后有人(scala?)将此时间戳转换回您本地时区的时间戳,但错误地使用了一小时的偏移量。

我不知道如何准确地解决这个问题,但要么使用timestamp without time zone整个组件,要么修复认为 1900 年波兰时间与 UTC 偏移 1 小时的组件。