Ios 是否可以使用可解码的Firestore时间戳/日期?
我有一本字典是Ios 是否可以使用可解码的Firestore时间戳/日期?,ios,swift,firebase,google-cloud-firestore,Ios,Swift,Firebase,Google Cloud Firestore,我有一本字典是[String:Bookmark],但是createdAt被保存为时间戳,解码器在试图理解日期时抛出一个错误 ***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“JSON写入中的类型无效(uu NSDate)” 有没有办法让Swift的可解码协议能够很好地与Firestore时间戳配合使用 编辑: 如果我打印[String:Any],然后像这样尝试在控制台中解码 ▿ 1 : 2 elements - key : "mess
[String:Bookmark]
,但是createdAt被保存为时间戳
,解码器在试图理解日期时抛出一个错误
***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“JSON写入中的类型无效(uu NSDate)”
有没有办法让Swift的可解码
协议能够很好地与Firestore时间戳配合使用
编辑:
如果我打印[String:Any]
,然后像这样尝试在控制台中解码
▿ 1 : 2 elements
- key : "messageCreatedAt"
- value : 2018-11-27 20:59:11 +0000
po valueDict["messageCreatedAt"] as? Date
我明白了
如何解码日期由属性值定义 如果必须从字符串解析
Date
,则应使用或(或者如果日期格式非常自定义、复杂和/或怪异,则可能需要使用)
您的日期字符串几乎是iso8601
格式的(它只缺少日期和时间部分之间的T
),但这足以失败
因此,您最好的选择是使用格式化(:)
:
然后
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(dateFormatter)
let bookmark = try decoder.decode(Bookmark.self, from: data)
print(bookmark.messageCreatedAt, bookmark.messageCreatedAt.timeIntervalSince1970)
// prints "2018-11-27 20:59:11 +0000 1543352351.0"
请将您试图解析的JSON添加到问题中。@user28434添加了jsonfixed。日期是固定的。json来自firestore,而不是由一个人创建的fwiw
▿ Optional<Date>
▿ some : 2018-11-27 20:59:11 +0000
- timeIntervalSinceReferenceDate : 565045151.531769
{
"messageId": "abc123",
"messageCreatedAt": "2018-11-27 20:59:11 +0000"
}
// Declare it somewhere and reuse single instance as much as possible, formatter initialization is quite expensive
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX") // Better to fix Locale here
dateFormatter.dateFormat = "yyyy-MM-dd kk:mm:ss Z"
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(dateFormatter)
let bookmark = try decoder.decode(Bookmark.self, from: data)
print(bookmark.messageCreatedAt, bookmark.messageCreatedAt.timeIntervalSince1970)
// prints "2018-11-27 20:59:11 +0000 1543352351.0"