首先,如果我想将带有时区的日期时间映射到Slick,我应该使用哪个类OffsetDateTime
或ZonedDateTime
?至于Joda,我们只能使用DateTime
.
我怎么能写一些隐式的转换java8 ZonedDateTime
和Sql 之间Timestamp
的Slick表映射?
使用joda DateTime
来包含时区信息似乎非常简单.但是一旦切换到Java8,不太确定我是否应该使用ZonedDateTime
或者OffsetDateTime
,因为http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html建议使用OffsetDateTime.
对于我当前的代码,我只是使用Java8 LocalDateTime
,我写下隐含的光滑映射.
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更长的答案
之间的区别OffsetDateTime和ZonedDateTime通过回答涵盖什么的Java 8 ZonedDateTime和OffsetDateTime之间的区别?所以我在此不再重复.
但是,您需要阅读该内容以确定简短答案是否符合您的情况.
如果你使用Postgres,那么通过slick -pg项目支持java.time.我自己没有机会使用它,但显然值得调查一下,如果这是你正在使用的数据库.例如,参见"date2"附加组件的测试套件.
更好的答案(或者,未来的答案!)好消息是,在Slick中添加了对java.time数据类型的支持的主动拉取请求.您可以监控故障单上的进度,该进度当前是为Slick 3.2安排的.