我的这个项目使用的是 MySQL 数据库。但是现在,我想转向 PostgreSQL。除了有一个时间戳类型列的表外,一切正常。
//MedName is varchar, and DateTime is timestamp
String INSERT_REFILL = "INSERT INTO refill (MedName, DateTime) VALUES (?, ?)";
PreparedStatement ps = conn.prepareStatement(INSERT_REFILL);
ps.setString(1, "Tylenol");
java.sql.Timestamp sqlDate = new java.sql.Timestamp(new java.util.Date().getTime());
TimeZone tz = TimeZone.getTimeZone("GMT");
GregorianCalendar cal = (GregorianCalendar) GregorianCalendar.getInstance(tz);
ps.setTimestamp(2, sqlDate, cal);
我的问题:出于某种原因,setTimestamp 总是将 PreparedStatement 的值增加 5 小时。我在中环,所以由于夏令时,我的时间是 xx:xx:xx-0500(中环)。但我真的怀疑 +5 小时来自于此。有什么想法吗?
注意:我不是设置 PostgreSQL 数据库的人,而是我创建了表。
最佳答案
如您所说,美国中部时间现在比 UTC 时间早 5 小时。 (夏令时比 UTC 早 6 小时)。
所以你遇到了时区转换问题。听起来您正在将 UTC 中的时间戳视为本地时间。
您需要确定您的输入值所在的时区,然后将它们相应地输入到 Postgres。
也可能是 Postgres 为您正确地进行了转换,而您只是错误地读取了数据。它可能会按照应有的方式进行本地到 UTC 的转换,在这种情况下,您只需要在提取要显示的数据时从 UTC 转换回本地时间。
关于java - PostgreSQL PreparedStatement.setTimestamp 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6590267/