[英]How to Format a new Date() in JavaScript into an ISODate in JSON
[英]Format an ISODate form field in ReactiveMongo Play JSON
将MongoDB与Play框架和ReactiveMongo Play JSON库结合使用 ; 我正在尝试正确配置表单 。 我有一些存储在MongoDB中的日期,这些日期在ISODate
包装器/ monad中,并作为JSObject
处理:
Json.obj("dateOfBirth" -> Json.obj("$date" -> dateTimeLong))
case class FormData(_id: Option[BSONObjectID], name: String, dateOfBirth: Option[JSObject])
形式如下:
object MyForm {
val form = Form(
mapping(
"_id" -> ignored(Option.empty[BSONObjectID]),
"name" -> nonEmptyText,
"dateofBirth" -> ? // not `date` or `optional(date)`
)
)
}
我认为我需要在form
自定义绑定dateOfBirth
字段,但这是我遇到的困难。 我找不到在哪里包括隐式对象以格式化一种新类型,如此处所示 , 这也无济于事(看起来现在可能已经过时了)。
我认为bind
方法可能看起来像这样:
def bind(date: Date, dateFieldName: String): JsObject = {
val longDate = new DateTime(date.getTime())
.withZoneRetainFields(DateTimeZone.UTC)
.withZone(DateTimeZone.getDefault())
.getMillis
Json.obj(s"$$$dateFieldName" -> JsNumber(longDate))
}
但是我可能是错的,但是尝试尝试会很好,但是正如我说的那样,我似乎找不到在哪里插入custom formatter
的正确位置-我认为这应该在FormData
的伴随对象中(格式将用于嵌套字段)。 情况并非如此,因此我再次与社区接触。 感谢您的任何建议-特别是如果有更好的方法来解决此问题。
我知道答案就在那里,但绝对不应该如此隐藏! 这是给任何感到我痛苦的人的。 因此,我更改了以下内容:
case class FormData(_id: Option[BSONObjectID], name: String, dateOfBirth: Option[Date])
和形式
object MyForm {
val form = Form(
mapping(
"_id" -> ignored(Option.empty[BSONObjectID]),
"name" -> nonEmptyText,
"dateOfBirth" -> optional(date)
)(FormData.apply)(FormData.unapply)
)
}
现在是关键部分。 在case类的同伴对象 (我的对象是FormData )中,放置以下内容的地方(这是从Stephane Godbillon的答案此处更改的 ):
implicit val dateRead: Reads[Date] = (__ \ "$date").read[Long].map { date =>
new Date(date)
}
implicit val dateWrite: Writes[Date] = new Writes[Date] {
def writes(date: Date): JsValue = Json.obj(
"$date" -> date.getTime
)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.