约会两天rest

我正在使用Java JDBC将日期写入sql server 2008,然后将其读回。
读取的日期始终比书面日期提前两天。

我正在使用预准备语句插入包含Date字段的行。 日期值由以下人员提供:

java.sql.Date todaysDate = new java.sql.Date(System.currentTimeMillis()) ; System.out.println(todaysDate.toString()) -> 2012-07-02 ps.setDate(8, todaysDate); 

将日期写入db后,如果运行,sql server会显示正确的日期:

 select date from table_name where date!=null ->2012-07-02 

如果我通过JDBC运行相同的查询,则使用从结果集中检索日期值

 java.sql.Date sqlDate = rs.getDate("date") ; sqlDate.toString() ->2012-06-30 

插入的行是表中唯一具有非空日期的行,因此这似乎不是读取错误记录的情况。

我认为这将是一个众所周知的问题,但我在谷歌搜索“两天rest”问题时找到的唯一参考没有明确的答案。

有任何想法吗?

beeky(生活在过去)

JDBC驱动程序错误

事实certificate问题是MS jdbc驱动程序。 我尝试了日期类型和日期转换的所有可能组合,但没有任何效果。 经过大量的搜索(应该先完成!)我看到一个较旧的SO条目的评论暗示问题是来自Microsoft的版本3 jdbc驱动程序。 我得到了最新的驱动程序,版本4.something,问题消失了。

感谢所有试图提供帮助的人。 特别感谢Mike带来时间发布解决方案。 – = beeky

对于那些使用maven的人,请将其用于java 8:

   com.microsoft.sqlserver mssql-jdbc 6.2.1.jre8  

正如所指出的,如果您使用的是旧版本,则可能会遇到此问题,并且调试起来并不容易。

我最近遇到过这个问题几次并撕掉我的头发,然后记住如果字段是类型为date这种情况发生,将字段类型切换为类型datetime可以解决问题。

就像user903724所说的那样,更改为将要修复的版本4,但在我的情况下,当我使用sqljdbc4-3.0.jar时,此问题仍然会重现,但我将其更改为sqljdbc42.jar,此问题得到修复。 希望我的经验会有所帮助。 从sqljdbc42.jar下载

当我们在Microsoft sql中使用日期DataType时,就会出现这个问题。 我已修复此问题以将日期更改为日期时间。

如果您使用的是MSSQL 2015,请使用此Sqljdbc41来解决此问题

    com.microsoft.sqlserver sqljdbc41 6.0.8112  

您的问题是时区值(“GMT”)。
您需要在JDBC提取方法中引入此操作,如下所示:

 Calendar gmt = Calendar.getInstance(TimeZone.getTimeZone("GMT")); PreparedStatement stmt = connection.prepareStatement(sql); stmt.setDate(1, new Date(0)); // I assume this is always GMT ResultSet rs = stmt.executeQuery(); rs.next(); //This will output 0 as expected System.out.println(rs.getDate(1, gmt).getTime()); 

我有完全相同的问题。 一旦我使用java 6运行时环境而不是java 7运行时环境,2天的偏移就消失了。

因此,JDBC版本4.1与JDBC 3驱动程序的向后兼容性之间可能存在差异。

即使在Java 8中使用sqljdbc4,我也遇到了同样的问题。

一旦我不需要这个字段在应用程序中进行任何类型的比较,我通过在我的查询中转换字段来解决问题,如下所示: CAST(dbo.tblPwActividadeParticipanteDetalhe.Data AS VARCHAR(10))