【问题标题】:How to read a Firestore timestamp in Swift如何在 Swift 中读取 Firestore 时间戳
【发布时间】:2020-09-22 22:12:26
【问题描述】:

我正在尝试从我的 Firestore 数据库中读取时间戳并最终将其转换为日期,但由于某种原因,我的代码似乎没有返回任何内容。相反,它似乎只使用了我提供的默认值,即 0,因此它始终读取为 1970 年 1 月 1 日。

我试图在 Firestore 中阅读的文档包含一个名为 date 的字段,该字段具有一种时间戳。文档中还有其他字段,但为了简单起见,我已将这些字段排除在此问题之外。作为参考,文档中的其他字段已成功读取。

我试过下面的代码。请注意,我已将 Firebase 导入该类:

   surveyDataCollectionRef.whereField("uid", isEqualTo: Auth.auth().currentUser?.uid ?? "").getDocuments { (snapshot, error) in
            if let err = error {
                debugPrint("Error fetching docs: \(err)")
            } else {
                guard let snap = snapshot else { return }
                for document in snap.documents {
                    let data = document.data()
                    let timestamp = data["date"] as? TimeInterval ?? 0
                    let date = Date(timeIntervalSince1970: timestamp)
                    dateFormatter.timeZone = TimeZone(abbreviation: "GMT")
                    dateFormatter.locale = NSLocale.current
                    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm"
                    let strDate = dateFormatter.string(from: date)
                    
                    let newSurvey = Survey(date: strDate)
                    
                    self.surveys.append(newSurvey!)
                    self.currentSurveys = self.surveys
                }
                self.tableView.reloadData()
            }
        }
    }

【问题讨论】:

  • 请编辑问题以显示您希望收到的文档数据。在不知道该文件中实际内容的情况下,我们无话可说。如果您的文档没有名为“日期”的字段,这可能会解释这种行为。
  • 感谢您的建议。我用额外的信息更新了这个问题。该文档确实有一个名为“日期”的字段,所以似乎不是这样。当我打印到控制台时,我实际上也收到了时间戳......
  • 我建议将所有的调试信息添加到问题中,以便我们观察您观察到的内容。问题中应该有足够的信息,以便任何人都可以重现该问题。请阅读:stackoverflow.com/help/minimal-reproducible-example
  • date 是原生 Firestore 时间戳还是数字?因为您在客户端处理日期的方式表明您需要一个 Unix 时间戳(整数)。

标签: swift firebase google-cloud-firestore timestamp


【解决方案1】:

经过更多的尝试和错误后,我发现下面的代码似乎能够让我得到一个日期作为字符串值(并且采用我想要的正确格式:

if let timestamp = data["date"] as? Timestamp {
    let date = timestamp.dateValue()
    dateFormatter.dateStyle = .medium
    dateFormatter.timeStyle = .none
    strDate = "\(dateFormatter.string(from: date))"
}

【讨论】:

    猜你喜欢
    • 2019-09-22
    • 2021-03-31
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 2018-07-09
    • 2020-10-24
    • 2021-02-19
    • 1970-01-01
    相关资源
    最近更新 更多