Swift 如何在Firebase上查询带有时间戳的项目?

Swift 如何在Firebase上查询带有时间戳的项目?,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,我想从Firebase节点查询活动项。活动项由开始日期和结束日期分隔。 以下是结构示例: { "items" : { "itme1" : { "data" : "...", //some data "startDate" : 12345678, "endDate" : 23456789 }, "item2" : {...} } } 日期是Firebase时间

我想从Firebase节点查询活动项。活动项由开始日期和结束日期分隔。
以下是结构示例:

{
    "items" : {
        "itme1" : {
            "data" : "...", //some data
            "startDate" : 12345678,
            "endDate" : 23456789
        },
        "item2" : {...}
    }
} 
日期是Firebase时间戳,用于防止用户时间移动。
Firebase server上保存的项目如下所示:

//Init data to save
var dictionary = Dictionary<String,Any>()
dictionary["data"] = "some data"
dictionary["startDate"] = FIRServerValue.timestamp()

//Save data on Firebase
let itemRef = FIRDatabase.database().reference(withPath: "items").childByAutoId()
itemRef.setValue(dictionary)

//Set end date
itemRef.observeSingleEvent(of: FIRDataEventType.value, with: { (snapshot) in
    if let dict = snapshot.value as? NSDictionary, let createdAt = dict["startDate"] as? TimeInterval {
        let startDate = Date(firebaseTimestamp: createdAt)
        let endDate = startDate.dateByAddingHours(1) //Add one hour to startDate
        itemRef.updateChildValues(["endDate":endDate.timeIntervalSince1970 * 1000])
    }
})
//初始化要保存的数据
var dictionary=dictionary()
字典[“数据”]=“一些数据”
字典[“startDate”]=FIRServerValue.timestamp()
//在Firebase上保存数据
让itemRef=FIRDatabase.database().reference(带路径:“items”).childByAutoId()
itemRef.setValue(字典)
//设定结束日期
itemRef.observeSingleEvent(属于:FIRDataEventType.value,其中:{(快照)位于
如果让dict=snapshot.value作为NSDictionary,那么让createdAt=dict[“startDate”]作为时间间隔{
让startDate=Date(FireBaseTimstamp:createdAt)
让endDate=startDate.dateByAddingHours(1)//在startDate上加一个小时
itemRef.UpdateChildValue([“endDate”:endDate.timeIntervalSince1970*1000])
}
})
如何查询Firebase以获取
endDate>=FIRServerValue.timestamp()
(活动项)的项

由于firebase时间戳
FIRServerValue.timestamp()
只有在写入firebase后才能知道,因此我无法直接查询
FIRServerValue.timestamp()

也许有更好的方法来设置结束日期。人们是如何处理这个问题的?

你可以试试这样的方法。这将只查询结束日期等于或大于当前日期的项目

let removeBeforeThisDate = NSDate()
let currentDateTimestamp = removeBeforeThisDate.timeIntervalSince1970

itemRef.queryOrderedByChild("endDate").queryStartingAtValue(currentDateTimestamp).observeEventType(.Value, withBlock: { snapshot in
...

有什么原因不能查询endDate startingAtValue(currentTimeStamp)吗?它将返回endDate大于currentTime的所有节点。也许我不完全理解这个问题?您是否始终希望将当前时间戳作为开始日期写入,而结束日期将始终晚于一小时?我可以查询
enddatestartingatvalue(currentTimeStamp)
但要获取currentTimeStamp,我需要在firebase上保存
FIRServerValue.timestamp()
第一次以获取当前值。这将是一个消耗资源的查询,因此可能有另一种解决方案来处理时间戳。是的,我总是想保存当前时间戳,因为开始日期和结束日期可能不同(1小时或更长)。我同意,但如果用户更改设备的时间,则可以轻松修改时间戳。您可以使用let serverTime=ServerValue.timestamp(),将其作为值传递给查询。服务器将在收到时将其解释为当前时间戳。请查看此处以了解更多信息: