混淆mysql, java日期和时区



考虑以下实体:

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' (OK in UTC)
- delivery_date = '2014-03-17 23:00:00' (OK in UTC)
- schedule_date date = '2014-03-17' (OK in UTC)

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

我知道当日期。调用toString时,它获取本地时区,但如何避免这种行为?我是否正确存储这些值?

最初的小时是17,我需要检索17

似乎你的应用服务器和MySQL都有3小时w.r.t. UTC的差异。

设置时区为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

MySQL JDBC驱动程序(包括最新的5.1.29版本)在处理时区和DATE(不是DATETIME)列时有一个错误:

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

在bug报告中建议的解决方法是添加"useServerPrepStmts=true"。

相关内容

  • 没有找到相关文章

最新更新