我尝试使用anorm将timestamp字段保存到postgresql。在scala代码中存储为java.time.Instant(someTime变量)实例的日期/时间
DB.withConnection() { implicit c =>
SQL("INSERT INTO t_table(some_time) values ({someTime})").on('someTime -> someTime)
}
但是现在无法使用它(播放2.3.7)。
使它运作的最佳方法是什么?
答案 0 :(得分:2)
我相信大多数人都在使用JodaTime,所以可以解释为什么它会丢失。如果它不是Anorm的一部分,你可以编写自己的转换器。
这是未经测试但看起来像下面的
import java.time.Instant
import java.time.format.DateTimeFormatter
import java.util.TimeZone
import anorm._
object InstantAnormExtension {
val dateFormatGeneration = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss-Z")
implicit def rowToDateTime: Column[Instant] = Column.nonNull { (value, meta) =>
val MetaDataItem(qualified, nullable, clazz) = meta
value match {
case ts: java.sql.Timestamp => Right(ts.toInstant)
case d: java.sql.Date => Right(d.toInstant)
case str: java.lang.String => Right(Instant.from(dateFormatGeneration.parse(str)))
case _ => Left(TypeDoesNotMatch("Cannot convert " + value + ":" + value.asInstanceOf[AnyRef].getClass) )
}
}
implicit val dateTimeToStatement = new ToStatement[Instant] {
def set(s: java.sql.PreparedStatement, index: Int, aValue: Instant): Unit = {
if(aValue == null) {
s.setTimestamp(index, null)
} else {
s.setTimestamp(index, java.sql.Timestamp.from(aValue) )
}
}
}
}