Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 是否可以使用可解码的Firestore时间戳/日期?_Ios_Swift_Firebase_Google Cloud Firestore - Fatal编程技术网

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"