Skip to content

Instantly share code, notes, and snippets.

@borice
Created March 8, 2019 22:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save borice/0518bc4cda6d9e569214f3561ea435dc to your computer and use it in GitHub Desktop.
Save borice/0518bc4cda6d9e569214f3561ea435dc to your computer and use it in GitHub Desktop.
Convert to/from DateTime and LocalDate to BSONDateTime and ISODate
import org.joda.time.{DateTime, DateTimeZone, LocalDate, LocalDateTime}
import play.api.libs.json._
import reactivemongo.play.json._
object JodaBsonImplicitConverters {
// ### Automatic conversion of { DateTime, LocalDate } <-> BSONDateTime <-> ISODate ###
implicit val dateTimeRead: Reads[DateTime] =
(__ \ "$date").read[Long].map(new DateTime(_))
implicit val dateTimeWrite: Writes[DateTime] =
(dateTime: DateTime) => Json.obj("$date" -> dateTime.getMillis)
implicit val localDateRead: Reads[LocalDate] =
(__ \ "$date").read[Long].map { date => new LocalDate(date, DateTimeZone.UTC) }
implicit val localDateWrite: Writes[LocalDate] =
(localDate: LocalDate) =>
Json.obj("$date" -> localDate.toDateTimeAtStartOfDay(DateTimeZone.UTC).getMillis)
implicit val localDateTimeRead: Reads[LocalDateTime] =
(__ \ "$date").read[Long].map { dateTime => new LocalDateTime(dateTime, DateTimeZone.UTC) }
implicit val localDateTimeWrite: Writes[LocalDateTime] =
(dateTime: LocalDateTime) =>
Json.obj("$date" -> dateTime.toDateTime(DateTimeZone.UTC).getMillis)
// ###################################################################################
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment