混淆了mysql,java日期和时区

时间:2014-03-18 00:48:44

标签: java mysql hibernate date datetime

考虑以下实体:

Java : Message (Date registrationDate, Date deliveryDate, Date scheduleDate)
Mysql: message (registration_date datetime, delivery_date datetime, schedule_date date)

我们假设:

registrationDate = '2014-03-17 20:00:00'  
deliveryDate = '2014-03-17 20:00:00'  
scheduleDate = '2014-03-17 20:00:00'  

我试图理解为什么我在后续场景中使用Hibernate和mysql得到错误的日期:
1º使用& useLegacyDatetimeCode = false& serverTimezone = UTC连接字符串存储日期
- registration_date ='2014-03-17 23 :00:00'(在UTC中确定)
- delivery_date ='2014-03-17 23 :00:00'(在UTC中确定)
- schedule_date date ='2014-03- 17 '(在UTC中确定)

2º检索实体并在视图中显示(GMT-3):
- registrationDdate ='2014-03-17 20 :00:00'(确定)
- deliveryDdate ='2014-03-17 20 :00:00'(确定)
- scheduleDdate ='2014-03- 16 '(不行,2014-03-17 00:00:00 - 03:00 = 16/03/2014 21:00:00)

我知道当调用Date.toString时,它正在获取本地时区,但是如何避免这种行为?我正确地存储了这些值吗?

小时最初是17,我需要用17来检索。

2 个答案:

答案 0 :(得分:1)

看起来你的App Server和MySQL都有3小时的差异w.r.t. UTC。

将TimeZone设置为UTC,然后再进行检索。

示例

TimeZone.setDefault( TimeZone.getTimezone( "UTC" ) );
scheduleDdate = rs.getDate( "scheduleDdate" );

其他示例

System.out.println( TimeZone.getDefault() );
Calendar cal = Calendar.getInstance();
Date d = cal.getTime();
System.out.println( " d: " + d );
TimeZone.setDefault(TimeZone.getTimeZone("GMT-3"));
System.out.println( " d(GMT-3): " + d );
TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
System.out.println( " d(GMT)  : " + d );
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
System.out.println( " d(UTC)  : " + d );

结果

sun.util.calendar.ZoneInfo[id="IST",offset=19800000,dstSavings=0,
                    useDaylight=false,transitions=6,lastRule=null]
 d: Tue Mar 18 06:41:52 IST 2014
 d(GMT-3): Mon Mar 17 22:11:52 GMT-03:00 2014
 d(GMT)  : Tue Mar 18 01:11:52 GMT 2014
 d(UTC)  : Tue Mar 18 01:11:52 UTC 2014

答案 1 :(得分:0)

在处理时区和DATE(非DATETIME)列时,MySQL JDBC驱动程序(包括最新的5.1.29版本)中存在错误:

http://bugs.mysql.com/bug.php?id=71084

错误报告中建议的解决方法是添加“useServerPrepStmts = true”。