使用Java 8 Date / Time API进行Anorm

时间:2015-01-19 18:59:55

标签: scala datetime playframework playframework-2.3 anorm

我尝试使用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)。

使它运作的最佳方法是什么?

1 个答案:

答案 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) )
      }
    }
  }
}