Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Joda DateTime Field on Play Framework 2.0's Anorm

Tags:

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?

like image 793
bertzzie Avatar asked Jul 09 '12 02:07

bertzzie


1 Answers

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.

like image 80
mchv Avatar answered Sep 21 '22 02:09

mchv