【问题标题】:getTimestamp() does timezone converstion twice in MySQL JDBC connector?getTimestamp() 在 MySQL JDBC 连接器中进行两次时区转换?
【发布时间】:2012-05-16 08:11:46
【问题描述】:

我在 MySQL 数据库中有一个 DATETIME 类型的列,其值为 2012-05-07 19:59:12。我正在尝试从数据库中检索此值,假设它存储在 UTC 时区:

Calendar cal = Calendar.getInstance(new SimpleTimeZone(0, "UTC"));
Date date = resultSet.getTimestamp(1, cal);
System.out.println(date);

它输出(CEST 是我的本地时区,比 UTC 早 2 小时):

Mon May 07 23:59:12 CEST 2012

预期值为:

Mon May 07 21:59:12 CEST 2012

我在 JDBC URL 中使用这三个参数(Europe/BerlinCEST 相同):

..&useGmtMillisForDatetimes=true&useTimezone=true&serverTimezone=Europe/Berlin

是我的缺陷还是应该在 JDBC 驱动程序中额外配置一些东西?我正在使用mysql:mysql-connector-java:5.1.20

【问题讨论】:

  • 我认为你让这变得比它需要的更复杂一些。当数据库不支持时区时,JDBC 支持使用日历检索时间戳。 MySQL 有,所以这是不必要的。您也可以(可能)忘记 jdbc url 上的所有自定义设置。只需使用getDate(),你就会得到一个java.util.Date,它是独立于时区的,直到你用特定的时区格式化它。
  • 嗯,这就是它的工作原理:&useGmtMillisForDatetimes=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&useTimezone=true&serverTimezone=UTC,不过感谢您的建议,我会试一试

标签: java mysql jdbc


【解决方案1】:

有了这些JDBC URL params 就可以了:

useGmtMillisForDatetimes=true
useJDBCCompliantTimezoneShift=true
useLegacyDate‌timeCode=false
useTimezone=true
serverTimezone=UTC

【讨论】:

  • 很好的答案,对我来说非常有效。注意:“useLegacy”和“DatetimeCode”之间有两个(不可见)0x00 字符,这意味着如果有人将其复制粘贴到属性文件中,这将不起作用。我这样做了,很难追踪。以防万一其他人尝试这样做。
  • 仍有不可见的字符...现在已修复!!
  • MySQL 连接器reference 表示属性useJDBCCompliantTimezoneShiftuseTimezone 是互斥的。我成功使用useTimezone=false
  • 而 useLegacyDate‌timeCode=false 会禁用 useTimezone、useJDBCCompliantTimezoneShift 和 useGmtMillisForDatetimes 的效果,因此唯一需要的选项是 serverTimezone。
  • @RandyRizun 哈,哈。有一个\u200c ZERO WIDTH NON-JOINER
猜你喜欢
  • 2021-01-14
  • 1970-01-01
  • 2011-03-29
  • 2016-04-28
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 2020-05-25
  • 2013-08-08
相关资源
最近更新 更多