ZonedDateTime对SQL数据库的持久性

Sab*_*ine 5 java mysql time timezone zoneddatetime

美好的一天,
我创建了将在全球范围内使用的Web应用程序服务。
因此,我需要将日期时间值存储在UTC中,并以墙上时间的时钟表示给最终用户。
读完堆栈溢出后,我知道应该:

  1. 将时间戳记用作DB中的列类型(当前为MariaDB 10.1.20)
  2. 在Java中使用ZonedDateTime(我使用java8)

在这些值之间转换时出现了问题。
使用JDBC时,必须进行以下转换:

java.sql.Timestamp <-> java.time.ZonedDateTime 
Run Code Online (Sandbox Code Playgroud)

我的代码:

// Get current zonedDateTime
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneOffset.UTC);

// Convert zonedDateTime to java.sql.Timestamp before saving to DB
Timestamp = Timestamp.from(zonedDateTime.toInstant());

// Get zonedDateTime from resultSet
Timestamp timestamp = (Timestamp) resultSet.getObject("created");
ZonedDateTime zonedDateTime = 
    ZonedDateTime.ofInstant(ts.toInstant(), ZoneOffset.UTC))
Run Code Online (Sandbox Code Playgroud)

当我使用时:

zonedDateTimeBeforeSave.isEqual(zonedDateTimeAfterSave);
Run Code Online (Sandbox Code Playgroud)

它返回false(我需要在我的域模型的重写的equal方法中将它们进行比较)
下面两种打印出来:

zonedDateTimeBeforeSave:2017-01-24T20:18:17.720Z
zonedDateTimeAfterSave:2017-01-24T20:18:17Z

问题:

  1. 我的选择正确吗?也许,我应该使用另一列或Java类型...
  2. 我做转换正确吗?也许还有另一种更好的方法

谢谢

  1. 编辑:在马特·约翰逊(Matt Johnson)的帮助下,我明白了问题所在,事实上,当我将日期时间保存到数据库时,虽然应该保存,但它不保存分数。FYI列的类型为timestamp(6)。
  2. 编辑:现在我使用java.time.Instant而不是ZonedDateTime

Sab*_*ine 2

看了这篇文章和评论后,我终于找到了问题所在:

http://mysqlnoob.blogspot.com/2016/09/replication-from-mysql-56-to-mariadb-10-fails-with-fractional-seconds.html

原因是我的 MariaDB JDBC 驱动程序
是旧的 1.1.7 版本,并且参数“useFractionalSeconds”设置为 false。
解决方案是将此参数设置为 true(通过 URL 进行 f.ex)或更新驱动程序。截至 2017 年 1 月 25 日,当前最新版本为 1.5.7