考虑以下实体:
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° 检索实体并在 View 中显示 (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 点检索。
最佳答案
您的应用服务器和 MySQL 似乎相差 3 小时。世界标准时间。
将时区设置为 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
关于java - 关于mysql、java日期和时区的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22468364/