(tomcat8,jdk8,5.5.41-MariaDB,mysql-connector-java-5.1.40-bin.jar,windows10)
我在使用Europe/Helsinki system timezone的同一台计算机的表,webapp客户端和数据库服务器中有此DATETIME值。
DST + 1h适用于 2017-03-26 02:59:59 EET - > 2017-03-26 04:00:00 EEST 。我的数据库表有一个值: 2017-03-26 03:54:03
HeidiSQL和mysql.exe控制台将日期时间值显示为 2017-03-26 03:54:03 。这是一个正确的UTC值,挂钟将 2017-03-26 06:54:03 值。
Mysql查询select @@time_zone, @@system_time_zone
提供SYSTEM,FLE夏令时结果。
Jdbc结果集提供的值为 2017-03-26 04:54:03 ,使用rs.getString("created_utc")
或rs.getTimestamp("created_utc")
getters会发生这种情况。将此值转换为挂钟是 2017-03-26 07:54:03 这是正确的,但期望得到原始03:XX:XX而不是04:XX: XX邮票。
另外这个给出了 2017-03-26 04:54:03 的价值,但预计会有03:54:03时间部分。
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
java.sql.Timestamp ts = rs.getTimestamp("created_utc", cal);
其他小时邮票很好,但只有这03:XX:XX小时数据返回+ 1小时太多。所以jdbc值04:01:00到挂钟07:01:00按预期工作。我猜所有的时间戳都会错误一小时,但事实并非如此。 00:XX:XX-02:XX:XX和04:XX:XX-23:XX:XX按预期工作。
我能够使用丑陋的黑客来解决这个问题但确定这不是最终答案吗?
byte[] buf=rs.getBlob("created_utc").getBytes(1, (int)rs.getBlob("created_utc").length());
String sval = new String(buf, "ISO-8859-1"); // "2017-03-26 03:54:03" utc string
Calendar cal = DateUtil.fromUTC(sval); // "2017-03-26 06:54:03" system timezone
编辑这被标记为重复,所以我在这里编辑我的解决方案,问题解决了使用链接主题和此问题中的评论。
jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=utf8&useLegacyDatetimeCode=false
jdbc string rs.getTimestamp("started_utc", sqlUTC)
getter用于日期时间字段