我有一个 java 程序,它以二进制格式的 Postgresql 的 COPY 命令所期望的二进制格式生成时区值。数据被写入二进制文件,然后我使用复制命令将其插入到 Postgresql 中,并插入到带有时间戳列(无时区)的表中。
该格式本质上是数字 8 作为 4 字节值,后跟自 2000-01-01 以来的微秒作为 8 字节值。
我发现 Postgresql 和 Java 对时区偏移的解释有所不同。当我尝试写日期时:
2004-11-01 09:34:42.432
在 postgres 二进制格式中是
0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x8a, 0xcd, 0xe3, 0x10, 0x68, 0x00
并且 postgres 正确报告日期。但是,如果我输入日期
2010-11-01 09:34:42.432
在二进制中是
0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x36, 0xf8, 0x72, 0xcb, 0x64, 0x00
我得到 2010-11-01 08:34:42.432 作为 Postgres 中的时间戳。
进一步的调查表明,Postgres 认为 2010 年的 UTC 偏移量是 -5,而 Java 认为它的 -4(我相信这是正确的)导致一小时的差异。有谁知道解决这个问题的方法是什么?
相关资料:
Postgresql 版本 9.2.4
爪哇:7
在东部时区(美国/纽约)工作。
操作系统:Linux(时区设置正确)