ScalaSlick3.0在java8OffsetDateTime和Timestamp之间的隐式映射



第一个问题是,如果我想将带有时区的日期时间映射到Slick,我应该使用OffsetDateTime还是ZonedDateTime?至于Joda,我们只能使用DateTime

如何编写一些隐式的代码来在java8ZonedDateTime和SqlTimestamp之间转换Slick表映射?

使用joda DateTime来包含时区信息似乎非常简单。然而,一旦切换到Java8,就不太确定我应该使用ZonedDateTime还是OffsetDateTime,因为http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html建议使用偏移日期时间。

对于我当前的代码,我只使用Java8LocalDateTime,并编写以下隐式代码来映射slick。

implicit val JavaLocalDateTimeMapper = MappedColumnType.base[LocalDateTime, Timestamp](
    l => Timestamp.valueOf(l),
    t => t.toLocalDateTime
  )

不太确定我能用ZonedDateTimeOffsetDateTime写类似的东西吗?

简短回答

从Slick 3.1开始,简单的答案是使用OffsetDateTime,但您需要将它映射到String列,而不是Timestamp,以便它与任何数据库一起工作。

也就是说,你需要一个MappedColumnType.base[OffsetDateTime, String]。您可以使用toStringOffsetDateTime.parse进行字符串转换:

scala> import java.time._
import java.time._
scala> val paris = ZoneId.of("Europe/Paris")
paris: java.time.ZoneId = Europe/Paris
scala> OffsetDateTime.now(paris)
res0: java.time.OffsetDateTime = 2016-01-05T20:38:46.473+01:00
scala> OffsetDateTime.parse(res0.toString)
res2: java.time.OffsetDateTime = 2016-01-05T20:38:46.473+01:00

较长的答案

"java 8 ZonedDateTime和OffsetDateTime之间的区别是什么?"?,所以我不在这里重复了。

然而,你需要阅读它来决定简短的答案是否符合你的情况。

如果您使用Postgres,则可以通过光滑的pg项目支持java.time。我自己还没有机会使用它,但如果这是你正在使用的数据库,显然值得调查。例如,请参阅"date2"插件的测试套件。

更好的答案(或者,未来的答案!)

好消息是,有一个活动的pull请求添加对Slick中java.time数据类型的支持。您可以监控票证的进度,该票证目前计划用于Slick 3.2。

我不相信有一个fork发布过,但它确实支持Java8时间:

https://github.com/xavier-fernandez/slick

它非常稳定,我一直在产品中与HSQLDB一起使用

https://github.com/slick/slick/pull/1349

如果你正在寻找代码生成,使用上面提到的fork并不太难,这篇文章描述了如何做到这一点:

https://github.com/slick/slick/pull/1349#issuecomment-245566307

最新更新