问题描述:
使用UTC时区插入数据,再获取后,数据相差8小时。
测试代码:
public class TestMain {
/*
先在达梦数据库创建测试表。
create table testDM (
uuid varchar(64) not null,
testtime datetime
);
*/
public static void main(String[] args) throws Exception {
System.out.println("Start...");
String testUUID=UUID.randomUUID().toString();
Connection con = connection();
// 插入数据
String insertSql = "insert into testDM values( ?,? )";
PreparedStatement insertPstmt = con.prepareStatement(insertSql);
insertPstmt.setString(1, testUUID);
Date now=new Date();
System.out.println( "Now time:"+now );
Calendar cal1=Calendar.getInstance(TimeZone.getTimeZone("UTC"));
insertPstmt.setTimestamp(2, new Timestamp(now.getTime()), cal1);
insertPstmt.executeUpdate();
System.out.println( "Insert done..." );
// 获得数据
String querySql = "select testtime from testDM where uuid = ?";
PreparedStatement queryPstmt = con.prepareStatement(querySql);
queryPstmt.setString(1, testUUID);
ResultSet rs=queryPstmt.executeQuery();
while(rs.next()){
Calendar cal2 = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
Timestamp ts = rs.getTimestamp(1, cal2);
Date queryDate = new Date(ts.getTime());
// 发现时间数据,相差8小时。
System.out.println( "query testtime:"+queryDate );
}
System.out.println("End...");
}
public static Connection connection() throws Exception {
Class.forName("dm.jdbc.driver.DmDriver");
String url = "jdbc:dm://172.16.40.32:5259/testjw_5259";
String username = "SYSDBA";
String password = "SYSDBA";
Connection con = DriverManager.getConnection(url, username, password);
return con;
}
}
代码说明:
先在达梦数据库创建测试表,其中一个字段类型为datetime
使用UTC TimeZone插入时间戳到该字段。
再次使用UTC TimeZone获取该字段的值,发现相差8小时。
测试截图:
环境:达梦8(安装在Kylin)(字段类型使用datetime),相差8小时
环境:达梦8(安装在window 7)(字段类型使用datetime),也相差8小时
环境:Mysql(安装在window),(字段类型使用datetime)正常(Mysql正常)
环境:Oracle(安装在widnow),(字段类型使用timestamp)正常(Oracle正常)
=========== 以下为旧的调研(可以不用看) ============
达梦数据库在5.6.5-GA上面兼容时,目前有个问题:
我们产品保存时间时,存到数据库是转成标准时区的时间(UTC),读取时,根据当前环境运行的时区,转换成相应的时间,
比如我们是东8区,存到数据库的时间是少8个小时的,取的时候会自动加上8个小时。
目前的问题是,存到dm的时间是少8个小时,但是取的时候,没有相应加8个小时
产品在其它数据库是正常的(如Sql server,Oracle),所以推断是达梦数据库驱动的问题。
需要达梦技术人员进行排查和修复。
使用的Hibernate版本:3.3.2GA
使用UTC时区插入数据,再获取后,数据相差8小时。其他数据库(Mysql/Oracle)没有问题。
通过验证您的代码发现,您代码中进行了时区转换,建议将时区转换去掉后重新验证,本地环境验证可正常查询
1.首先检查应用所在服务器及数据库服务器的时区是否正常?date -R
2.使用其他客户端连接查下时间是否正常?
3.检查客户端所在服务器是否配置了dm_svc.conf,文件中是否配置了TIME_ZONE=(480)
Linux在etc目录下。
Windows32位:system32目录下。
Windows64位:system32和syswow64目录下。
4.可以尝试在jdbc连接串里添加localTimezone=480