swift 解码从firebase函数返回的时间戳

js81xvg6  于 2023-01-08  发布在  Swift
关注(0)|答案(1)|浏览(134)

我有一个firebase函数,它返回一个包含时间戳的对象

[{
    startTime: firestore.Timestamp.fromDate(randomDate),
    duration: 45 
}]

在swift中,我有一个表示这些数据的模型

struct AvailabilityTimeSlot: Codable {
    let startTime: Date
    let int: Duration
}

后跟调用函数并对其进行解码的代码

func fetchTimeSlotAvailability(date: Date, groomerId: String,  requestedServices: [Pet: [PetServiceAndPricing]]) async throws -> [AvailabilityTimeSlot] {
    let result = try await Functions.functions().httpsCallable("availableBookingTimeSlots")
        .call([
        "date": date.timeIntervalSince1970,
        "groomerId": groomerId,
        "requestedServices": requestedServices
    ])
    
    return try Firestore.Decoder().decode([AvailabilityTimeSlot].self, from: result.data)
}

返回的数据如下所示

[{
duration = 45;
startTime =         {
    "_nanoseconds" = 341000000;
    "_seconds" = 1673116451;
};]

但我收到解码错误

keyNotFound(TimestampKeys(stringValue: "seconds", intValue: nil), Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "startTime", intValue: nil)], debugDescription: "No value associated with key TimestampKeys(stringValue: \"seconds\", intValue: nil) (\"seconds\").", underlyingError: nil))

从firebase函数接收日期的推荐方法是什么?当使用FireStore阅读数据时,时间戳可以按预期工作,但对于函数则不行

gzjq41n4

gzjq41n41#

由于可调用类型函数总是返回JSON,而JSON是从您提供的数据自动序列化的,因此您可能需要决定如何以与JSON兼容的方式序列化时间戳的数据。默认情况下,该函数只是将找到的任何对象的内部表示转储到客户端,如您所见:

{
    "_nanoseconds" = 341000000;
    "_seconds" = 1673116451;
}

这些是Timestamp对象的内部字段,注意键的前缀是下划线--这是默认情况下获取的时间戳实现细节的一部分。
如果你想让你的前端代码访问这些转储的时间戳实现细节,这取决于你自己的决定。你甚至可以使用这些值在你的应用中重新构建一个新的时间戳。或者你可以有意识地编写代码来发送你想要的值(它将被转换为JSON)从函数中的时间戳,并确保您的应用代码已准备好接收该数据并将其转换为您需要的任何内容。
另见:

相关问题