第一个问题是,如果我想将带有时区的日期时间映射到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
)
不太确定我能用ZonedDateTime
或OffsetDateTime
写类似的东西吗?
简短回答
从Slick 3.1开始,简单的答案是使用OffsetDateTime,但您需要将它映射到String
列,而不是Timestamp
,以便它与任何数据库一起工作。
也就是说,你需要一个MappedColumnType.base[OffsetDateTime, String]
。您可以使用toString
和OffsetDateTime.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