I've been learning Play Framework, and the recommended way to access a database is using the build in anorm component. Thing is, there's no good support for DateTime in anorm. It's still using java.util.Date
.
Is there any way to use Joda DateTime or java.sql.Timestamp in anorm?
If there's no way to use Joda or java.sql, can we add a module for that?
update: Since play 2.3.7 this is now natively supported.
I am using the following piece of code to work with DateTime seamlessly with Anorm.
import org.joda.time._ import org.joda.time.format._ import anorm._ object AnormExtension { val dateFormatGeneration: DateTimeFormatter = DateTimeFormat.forPattern("yyyyMMddHHmmssSS"); implicit def rowToDateTime: Column[DateTime] = Column.nonNull { (value, meta) => val MetaDataItem(qualified, nullable, clazz) = meta value match { case ts: java.sql.Timestamp => Right(new DateTime(ts.getTime)) case d: java.sql.Date => Right(new DateTime(d.getTime)) case str: java.lang.String => Right(dateFormatGeneration.parseDateTime(str)) case _ => Left(TypeDoesNotMatch("Cannot convert " + value + ":" + value.asInstanceOf[AnyRef].getClass) ) } } implicit val dateTimeToStatement = new ToStatement[DateTime] { def set(s: java.sql.PreparedStatement, index: Int, aValue: DateTime): Unit = { s.setTimestamp(index, new java.sql.Timestamp(aValue.withMillisOfSecond(0).getMillis()) ) } } }
I think it should definitively be part of Anorm, just need to be polished and more tested. Let me know if it has helped you.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With