注册

使用UTC时区插入数据,再获取后,数据相差8小时。

佟宝林 2023/01/29 1536 3

问题描述:
使用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)没有问题。

回答 0
暂无回答
扫一扫
联系客服