我的日期的内部表示应始终是带有UTC时区的ISO格式(我使用Play提供的Joda的Reads
/ Writes
):
import org.joda.time.{DateTime, DateTimeZone}
import org.joda.time.format.ISODateTimeFormat
import play.api.libs.json._
import play.api.libs.json.Reads._
import play.api.libs.json.Writes._
scala> val dateTime = DateTime.now(DateTimeZone.UTC)
dateTime: org.joda.time.DateTime = 2014-08-12T21:10:24.048Z
scala> val js = Json.toJson(dateTime)(jodaDateWrites("yyyy-MM-dd'T'HH:mm:ss'Z"))
js: play.api.libs.json.JsValue = "2014-08-12T21:10:24Z"
到目前为止一切都很好......但如果我尝试序列化Option[DateTime]
我总是会收到此错误:
scala> val js = Json.toJson(Some(dt))(jodaDateWrites("yyyy-MM-dd'T'HH:mm:ss'Z"))
<console>:27: error: type mismatch;
found : play.api.libs.json.Writes[org.joda.time.DateTime]
required: play.api.libs.json.Writes[Some[org.joda.time.DateTime]]
Json.toJson(Some(dt))(jodaDateWrites("yyyy-MM-dd'T'HH:mm:ss'Z"))
如果我省略Writes
它有效......但当然格式不是我想要的格式:
scala> val js = Json.toJson(Some(dateTime))
js: play.api.libs.json.JsValue = 1407878787365
有没有办法序列化提供特定Option[DateTime]
的{{1}}?
然后,我的最后一个问题是,我试图用这样的UTC时区反序列化JSON ISO日期......
Writes
...即使我指定了模式val date = Json.parse(""" { "date": "2014-08-12T21:10:24Z" }""")
scala> val dt = date as (__ \ 'date).readNullable[DateTime](jodaDateReads("yyyy-MM-dd'T'HH:mm:ss'Z"))
dt: Option[org.joda.time.DateTime] = Some(2014-08-12T21:10:24.000+02:00)
,我也会在本地时区返回DateTime
。
除了编写自己的"yyyy-MM-dd'T'HH:mm:ss'Z"
之外还有其他选择吗? TX。
答案 0 :(得分:3)
Writes.nullable(jodaDateWrites("yyyy-MM-dd'T'HH:mm:ss'Z"))
这将序列化Option[DateTime]
,但如果值为None
,则不会写入任何字段。
Writes.optionWithNull(jodaDateWrites("yyyy-MM-dd'T'HH:mm:ss'Z"))
这也将序列化Option[DateTime]
,但如果值为null
则会写None
。
答案 1 :(得分:2)
您还可以定义自己的含义:
sapply(names(listMat), function(x) listMat[[x]][,listPosition[[x]], drop = FALSE])
#$A
# [,1] [,2]
#[1,] 1 4
#[2,] 2 5
#[3,] 3 6
#$B
# [,1]
#[1,] 10
#[2,] 11
#[3,] 12
答案 2 :(得分:0)
试试这些:
implicit val dateWrites = jodaDateWrites("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
implicit val dateReads = jodaDateReads("yyyy-MM-dd'T'HH:mm:ss.SSSZ")