2014-04-16 62 views
1

我试图在JDBC代码中检索并处理MySQL计算的DATE值。这里有一个小片断:JDBC和MySQL DATE关闭 - 如何更正

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。

+0

我在MySQL Workbench中获得2014-01-31。你直接执行查询的结果是什么? – demongolem

+0

事实上,我也直接获得了2014-01-31(我使用Sequel Pro只是为了多样化)。我的问题不是关于MySQL隔离,而是关于MySQL和JDBC在一起。 – Dan

回答

3

这迫使时间是不是依靠本地时间UTC:

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

您的查询,我相信回报当天的第一个实例上2014-01-31,所以减去几个小时区别呢把你放在前一天。

+0

我明白了。我会认为DATE值 - 特别是与TIME或DATETIME或TIMESTAMP相反 - 对时区无关紧要,但我想不是。 – Dan