我在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
您的问题未能指定正在使用的JDBC驱动程序,并且未能准确记录列的数据类型。所以我不能具体,但这里有一些普遍的帮助。
许多工具和数据库驱动程序在检索日期时间值时动态应用默认时区。善意的,这只会造成混乱和含糊不清。
在我看来,这种行为是一种反特征。首先,它模糊了存储在数据库中的实际数据。另一方面,程序员和系统管理员通常应该在UTC中进行日志记录,调试,跟踪,报告和数据存储/交换。
从JDBC 4.2开始,从数据库中检索日期时间值的现代方法是使用java.time类。
对于仅限日期的类型,类似于SQL标准的DATE
,请使用LocalDate
类。 LocalDate
类表示没有时间且没有时区或从UTC偏移的仅日期值。
LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
对于片刻类型,类似于SQL标准TIMESTAMP WITH TIME ZONE
,使用OffsetDateTime
。 OffsetDateTime
类表示具有时间和从UTC偏移的日期。
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
对于具有时间但缺少时区或从UTC偏移的日期,类似于SQL标准TIMESTAMP WITHOUT TIME ZONE
,请使用LocalDateTime
。请注意,此类型不代表片刻,仅表示大约26-27小时范围内的潜在时刻(全球范围内的时区范围)。
LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.Date
,Calendar
和SimpleDateFormat
。
现在在Joda-Time的maintenance 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的试验场。你可能会在这里找到一些有用的类,如Interval
,YearWeek
,YearQuarter
和more。