【发布时间】:2012-07-03 00:58:18
【问题描述】:
我正在使用 Java JDBC 将日期写入 SQL Server 2008,然后将其读回。
回读的日期始终比实际写入的日期早两天。
我正在使用准备好的语句插入包含日期字段的行。日期值由以下提供:
java.sql.Date todaysDate = new java.sql.Date(System.currentTimeMillis()) ;
System.out.println(todaysDate.toString()) // -> 2012-07-02
ps.setDate(8, todaysDate);
将日期写入数据库后,如果我运行,SQL 服务器会显示正确的日期:
select date from table_name where date!=null // ->2012-07-02
如果我通过 JDBC 运行相同的查询,则使用
从结果集中检索日期值java.sql.Date sqlDate = rs.getDate("date") ;
sqlDate.toString() // ->2012-06-30
插入的行是表中唯一具有非空日期的行,因此这似乎不是读取错误记录的情况。
我认为这将是一个众所周知的问题,但我可以通过 Google 搜索找到的关于“请假两天”问题的唯一参考没有明确的答案。
有什么想法吗?
beeky(生活在过去)
【问题讨论】:
-
如果你使用preparedStatement,不要从或转换成String。将日期(或时间戳)对象传递给 setDate。
-
服务器和客户端的时区是什么?
-
您确定这与 MM-DD-YYYY 与 DD-MM-YYYY 无关吗?如果您的日期往返于字符串,它们可以通过区域设置以有趣和意想不到的方式重新解释(在客户端运行时、数据库库和数据库代码中)。
-
@dystroy - 我正在使用 java.sql.Date obj 在准备好的 stmt 中设置值。你是不是想说相反的意思,例如使用字符串吗?
-
打印日期值的时间部分以查看确切的偏移量可能非常有趣。
标签: java sql-server date jdbc