[英]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.