java - PostgreSQL PreparedStatement.setTimestamp 问题

标签 java mysql postgresql

我的这个项目使用的是 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/

相关文章:

php - 仅显示数据库中的最新条目并每 5 分钟不断检查更新

postgresql - 使用 IN 的 Rails PostgreSQL 语法错误

sql - 在两列上创建索引以检查日期是否介于这两个列之间

java - 从结果中识别出 "best bang for the buck"项

java - 如果消费者线程遇到异常,如何停止生产者线程

java - Java中测试数字是否为素数

java - 使用字符数组删除字符串中的空格

php - 使用OUTFILE命令将mysql数据库导出为.sql格式

php - mysqldump 通过 PHP system() 生成一个空白文件

mysql - 合并两个表中的多个列