一尘不染

尝试在Swift中将Firebase时间戳转换为NSDate

swift

我正在尝试在Swift应用中使用Firebase时间戳。我想将它们存储在Firebase中,并将其用作应用程序中的本机NSDate对象。

文档说他们是Unix时代,所以我尝试了:

NSDate(timeIntervalSince1970:FirebaseServerValue.timestamp)

没有运气。

这个:

FirebaseServerValue.timestamp

退货

0x00000001199298a0

根据调试器。传递这些时间戳的最佳方法是什么?


阅读 263

收藏
2020-07-07

共1个答案

一尘不染

ServerValue.timestamp()与在Firebase中设置普通数据有些不同。它实际上没有提供时间戳。而是提供一个值,该值告诉Firebase服务器用时间填写该节点。使用此功能,您应用的时间戳全部来自一个来源,即Firebase,而不是用户设备碰巧所说的任何时间戳。

当您(从观察者)取回该值时,您将获得自该纪元以来的时间(以毫秒为单位)。您需要将其转换为秒以创建NSDate。这是一段代码:

let ref = Firebase(url: "<FIREBASE HERE>")

// Tell the server to set the current timestamp at this location.
ref.setValue(ServerValue.timestamp())

// Read the value at the given location. It will now have the time.
ref.observeEventType(.Value, withBlock: { 
    snap in
    if let t = snap.value as? NSTimeInterval {
        // Cast the value to an NSTimeInterval
        // and divide by 1000 to get seconds.
        println(NSDate(timeIntervalSince1970: t/1000))
    }
})

您可能会发现您收到两个带有非常接近的时间戳的事件。这是因为在从Firebase收到回音之前,SDK将在时间戳上进行最佳猜测。一旦从Firebase听到了实际值,它将再次引发Value事件。

2020-07-07