问题描述
我对在官方 JDBC 驱动程序中使用 PostgreSQL 的 TIMESTAMPTZ 类型感到困惑。
如果我错了,请纠正我,但 PostgreSQL 和 Java 存储 TIMESTAMTZ 和 java.util.Date
相同:作为从 Unix 开始的毫秒数,定义为 1970-01-01 00:00:00 UTC .
因此,从技术上讲,我们使用相同的 Long 值进行操作,应该不会出现问题。
然而,我们在一个或其他方向上进行大量转换的代码中遇到了很多问题,这些问题被更复杂的转换所取代,这些转换恰好在之后起作用。最终结果有点类似于 https://stackoverflow.com/a/6627999/5479362,在两个方向都转换为 UTC。在 Windows 下开发,时区更改被阻止,这使得调试变得不那么容易。
如果我有一个包含该列的 PostgreSQL 表:
last_modified TIMESTAMP WITH TIMEZONE
我想用 Date 实例查询它:
Date modifiedAfter = new SimpleDateFormat("yyyy-MM-dd hh:MM:ss").parse("2021-06-11 15:20:00");
PreparedStatement ps = conn.prepareStatement("Select * from mytable where last_modified > ?");
ps.setDate(1,modifiedAfter);
它会正常工作,因为 PostgreSQL JDBC driver 会使用我的 java 程序的语言环境将 java 日期转换为 UTC Long,而数据库服务器将在查询该日期时使用自己的语言环境?
或者如果服务器的 Locale 与客户端的 Locale 不同,这些转换没有正确处理,因此我只需要在 UTC 日期上操作?
我在上面链接的答案中遇到的问题是,OP 声称它“对他有用”,这意味着 Java 总是读取写入的内容,但不一定正确存储值在数据库中,以便其他客户端可以读取预期的内容。
上面的方法是否是处理 TIMESTAMTZ 的正确方法,以确保 两者 Java 代码和 PSQL 控制台中的查询输出将给出一致的结果?如果不是,正确的解决方案是什么?
我希望,当我使用运行 TimeZone +4 的 Java 程序编写“2021-11-06 15:00:00”时:
- TimeZone +2 的 Java 程序将获得“2021-11-06 13:00:00”
- 时区 +1 的 PSQL 客户端将获得“2021-11-06 12:00:00”
- 实习生,将是“2021-11-06 11:00:00”
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)