Jdbc datetime返回错误的日期时间值

时间:2017-05-05 15:22:59

标签: java mysql jdbc mariadb

(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用于日期时间字段

0 个答案:

没有答案