在mysql workbench和java app中获取不同的date值

问题描述 投票:1回答:1

我在mysql workbench中使用select函数的小时值与我在java中使用连接的小时值不同。 Java总是提前1小时返回。

**Table1**
id INT
data DATETIME

我用来从java程序访问数据库的代码是这样的:

public void iniConnection() throws ClassNotFoundException, SQLException{
    c = null;
    Class.forName("com.mysql.cj.jdbc.Driver");
    c = DriverManager.getConnection(url,login,password);   
}

public void closeConnection() throws SQLException{
            c.close();           
    }

public ArrayList execGetProcedure(String procedimento) throws ClassNotFoundException, SQLException{
    iniConnection();
        Statement st = c.createStatement();
        ResultSet res = st.executeQuery(procedimento);
        ArrayList<Object> out = new ArrayList<Object>();
        int i = 1;
        int colC = res.getMetaData().getColumnCount();
        while(res.next()){
            while(i<(colC+1)){
                out.add(res.getObject(i));
                i++;
            }          
            i=1;              
        }
        st.close();
        res.close();
        closeConnection();
    return out;
}

这个函数execGetProcedure返回一个arraylist,我用它来填充表格。

问题是,如果在数据库中数据(日期时间)值是2018-10-11 18:50:40我在arraylist中获得的是2018-10-11 19:50:40。希望你能帮忙。

Ps:这是我用来获取登录名,密码和数据库位置/名称的配置文件的内容。

 jdbc:mysql://192.168.96.7:3306/Src?useLegacyDatetimeCode=false&useTimezone=true&serverTimezone=GMT
 perf
 cor
java mysql
1个回答
0
投票

您的问题未能指定正在使用的JDBC驱动程序,并且未能准确记录列的数据类型。所以我不能具体,但这里有一些普遍的帮助。

Dynamically-applied time zone is confusing

许多工具和数据库驱动程序在检索日期时间值时动态应用默认时区。善意的,这只会造成混乱和含糊不清。

在我看来,这种行为是一种反特征。首先,它模糊了存储在数据库中的实际数据。另一方面,程序员和系统管理员通常应该在UTC中进行日志记录,调试,跟踪,报告和数据存储/交换。

JDBC 4.2

从JDBC 4.2开始,从数据库中检索日期时间值的现代方法是使用java.time类。

java.time

对于仅限日期的类型,类似于SQL标准的DATE,请使用LocalDate类。 LocalDate类表示没有时间且没有时区或从UTC偏移的仅日期值。

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

对于片刻类型,类似于SQL标准TIMESTAMP WITH TIME ZONE,使用OffsetDateTimeOffsetDateTime类表示具有时间和从UTC偏移的日期。

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

对于具有时间但缺少时区或从UTC偏移的日期,类似于SQL标准TIMESTAMP WITHOUT TIME ZONE,请使用LocalDateTime。请注意,此类型不代表片刻,仅表示大约26-27小时范围内的潜在时刻(全球范围内的时区范围)。

LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;

About java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.DateCalendarSimpleDateFormat

现在在Joda-Timemaintenance mode项目建议迁移到java.time班。

要了解更多信息,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规格是JSR 310

您可以直接与数据库交换java.time对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。你可能会在这里找到一些有用的类,如IntervalYearWeekYearQuartermore

© www.soinside.com 2019 - 2024. All rights reserved.