Java JDBC和MySQL的日期相差一天-如何更正

Java JDBC和MySQL的日期相差一天-如何更正,java,mysql,date,jdbc,Java,Mysql,Date,Jdbc,我试图在JDBC代码中检索和处理MySQL计算的日期值。下面是一个小片段: MysqlDataSource ds = new MysqlDataSource(); ds.setServerName("myservername"); ds.setUser("myusernamne"); ds.setPassword("******"); ds.setDatabaseName("mydbname"); ds.setUseJDBCCompliantTim

我试图在JDBC代码中检索和处理MySQL计算的日期值。下面是一个小片段:

    MysqlDataSource ds = new MysqlDataSource();
    ds.setServerName("myservername");
    ds.setUser("myusernamne");
    ds.setPassword("******");
    ds.setDatabaseName("mydbname");
    ds.setUseJDBCCompliantTimezoneShift(true);
    ds.setUseLegacyDatetimeCode(false);
    Connection con = ds.getConnection();
    PreparedStatement p = con.prepareStatement("select last_day('2014-01-15')");
    ResultSet rs = p.executeQuery();
    rs.next();
    Date date = rs.getDate(1);
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    System.out.println(df.format(date));
我希望它能打印
2014-01-31
,但它会打印
2014-01-30
。为什么,我能做些什么?运行我的JVM的机器位于美国东部地区,数据库位于UTC,但我认为,使用我设置的参数,它仍应正确处理该问题


如果有问题,我正在运行MySQL 5.5和MySQL connector java 5.1.16版。

这将强制时间为UTC,而不是依赖于本地时间:

Calendar gmt = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
rs.getDate(1, gmt);

我相信您的查询返回的是2014-01-31日当天的第一个实例,因此减去几个小时的差异确实会使您与前一天保持一致。

这强制时间为UTC,而不是依赖于当地时间:

Calendar gmt = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
rs.getDate(1, gmt);

我相信您的查询返回的是2014-01-31日当天的第一个实例,因此减去几个小时的差异确实会将您置于前一天。

我在MySQL Workbench中得到2014-01-31。直接执行查询的结果是什么?事实上,我也直接得到了2014-01-31(我使用Sequel Pro只是为了多样性)。我的问题不是关于单独的MySQL,而是关于MySQL和JDBC。我在MySQL Workbench中得到了2014-01-31。直接执行查询的结果是什么?事实上,我也直接得到了2014-01-31(我使用Sequel Pro只是为了多样性)。我的问题不是关于单独的MySQL,而是关于MySQL和JDBC。我本以为日期值——特别是相对于时间、日期时间或时间戳——与时区无关,但我猜不是。我明白了。我本以为日期值——具体来说,与时间、日期时间或时间戳相反——与时区无关,但我想不是。