繁体   English   中英

令人困惑的mysql,java日期和时区

[英]Confusing about mysql, java date and timezone

考虑以下实体:

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年3月17日23:00:00'(OK在UTC)
- DELIVERY_DATE = '2014年3月17日23:00:00'(OK在UTC)
-schedule_date date ='2014-03- 17 '(UTC中为OK)

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

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

最初的小时是17,我需要用17进行检索。

看来您的App Server和MySQL的UTC时间相差3个小时。

将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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM