约会倒计时。Swift 3和Firebase

约会倒计时。Swift 3和Firebase,firebase,swift3,nsdate,countdown,Firebase,Swift3,Nsdate,Countdown,我想使用我的Firebase数据库,它具有产品的值,即寿命(一个整数而不是日期),并使用它来比较用户添加项目的日期,即25/03/17,我不确定如何实现这一点。谁能给我一些建议吗。我相信这与近似值有关,因此如果liespan等于7,那么用户应该看到7天,并且每天都会减少,因此基本上是一个倒数。我已经阅读了NSDate文档和swifftdate框架,对可能需要使用的方法有一定的了解 我举了一个例子,它得到了订婚日期,并将其与结婚日期进行了比较,我认为这与我想要尝试实现的目标有些相似。但是,由于这使

我想使用我的Firebase数据库,它具有产品的值,即寿命(一个整数而不是日期),并使用它来比较用户添加项目的日期,即25/03/17,我不确定如何实现这一点。谁能给我一些建议吗。我相信这与近似值有关,因此如果liespan等于7,那么用户应该看到7天,并且每天都会减少,因此基本上是一个倒数。我已经阅读了NSDate文档和swifftdate框架,对可能需要使用的方法有一定的了解

我举了一个例子,它得到了订婚日期,并将其与结婚日期进行了比较,我认为这与我想要尝试实现的目标有些相似。但是,由于这使用了两个日期,我想使用一个日期和一个整数:

    formatter.dateFormat = "dd/MM/yyyy"

    let dateArray = message["message"] as! NSMutableArray

    if let startTimeString = dateArray[0] as? String {
        let weddingDate = formatter.dateFromString(startTimeString)
        var engagementDate:NSDate? = nil

        if let endTimeString = dateArray[1] as? String {
            engagementDate = formatter.dateFromString(endTimeString)
        }
        let now = NSDate()
        let totalEngagementTime = userCalender.components(.Day, fromDate: engagementDate!, toDate: weddingDate!, options: []).day
        let daysFromEngagementUntilNow = userCalender.components(.Day, fromDate: engagementDate!, toDate: now, options: []).day
        let percentage = (Double(daysFromEngagementUntilNow) / Double(totalEngagementTime)) * 100.00
        let timeUntilWedding = userCalender.components(requestedComponent, fromDate: now, toDate: weddingDate!, options: [])

希望我讲得通,提前谢谢你!:)

作为对OP评论的回应,这回答了如何计算的问题

两个日期之间的时间

以及在Firebase上执行查询以检索从现在到将来日期之间的事件

给定用于跟踪事件的Firebase结构:

events
  event_0
    datestamp: "20170405"
    event_name: "A concert"
  event_1
    datestamp: "20170501"
    event_name: "Wine tasting"
  event_2
    datestamp: "20170410"
    event_name: "50th birthday"
假设今天是20170402(2017年4月2日),当我们运行以下代码和查询时,我们需要接下来30天的所有事件以及事件发生前的天数:

    let minuteInterval:TimeInterval = 60.0 //how to work with TimeIntervals
    let hourInterval:TimeInterval = 60.0 * minuteInterval
    let dayInterval:TimeInterval = 24 * hourInterval
    let sevenDaysInterval = dayInterval * 30 //30 days from now

    let today = Date() //today

    var futureDate = Date()
    futureDate.addTimeInterval(sevenDaysInterval) //future date is seven days from now

    let formatter = DateFormatter()
    formatter.dateFormat = "yyyyMMdd" //format the date to match how it's stored in Firebase
    let startString = formatter.string(from: today)
    let endString = formatter.string(from: futureDate)

    let eventsRef = self.ref.child("events")
    let myQuery = eventsRef.queryOrdered(byChild: "datestamp")
                                 .queryStarting(atValue: startString)
                                 .queryEnding(atValue: endString)
    myQuery.observeSingleEvent(of: .value, with: { snapshot in
        for child in snapshot.children {
            let snap = child as! FIRDataSnapshot
            let dict = snap.value as! [String: Any]
            let eventName = dict["event_name"] as! String
            let eventDateStampString = dict["datestamp"] as! String
            let endDate = formatter.date(from: eventDateStampString)
            let daysUntilEvent = self.daysDiff(startDate: today, endDate: endDate!)

            print("event: \(eventName)  days from now: \(daysUntilEvent)")
        }
    })
还有一个小函数用来计算日期的差异

func daysDiff(startDate: Date, endDate: Date) -> Int {
    let calendar = Calendar.current

    let date1 = calendar.startOfDay(for: startDate)
    let date2 = calendar.startOfDay(for: endDate)

    let a = calendar.dateComponents([.day], from: date1, to: date2)
    return a.value(for: .day)!
}
结果是

event: A concert  days from now: 3
event: 50th birthday  days from now: 8
event: Wine tasting  days from now: 29

可以肯定的是,在您的数据库中,您有一个寿命值(整数)和添加项目的日期(日期),对吗?如果是,则只需获取当前日期并查找日期差异,即可查看自添加项目以来已过了多少天。一旦达到寿命值,你可能会停止倒计时。我可以为你提供代码,如果这能让它变得更容易,但这应该会有所帮助-你想让它每天倒数吗?@Fahim,是的,你是对的,倒数会在它达到寿命时停止。我知道这可以应用于任何数据库,但您能否向我演示使用Firebase的方法?因此,目前我可以将购买物品的日期发送到数据库。然而,我刚刚意识到,用户正在提供这些数据,因此它无法工作。我一直试图让用户只选择表中的数据。如果这有意义的话。@Chace我恐怕最后一点对我来说没有任何意义:)但是你的想法可能与我完全不同。从我坐的地方,如果数据在表中,您应该能够获取它,如果您能够获取数据,您可以进行计算并显示结果。但由于我不知道你在想什么,我可能完全错了:)@Fahim目前我基本上可以创建一个事件并给它一个日期值。但我意识到这是错误的方法。我应该做的是像你提到的那样,获取数据并根据用户设置的日期进行计算。我是Firebase的新手,所以目前我只能获取用户添加的数据的快照并将其显示在tableView上。但是现在我需要显示具有生命周期的数据表。很抱歉响应延迟。我实际上想显示离活动还有多少天,而不是直到某个日期的活动。抱歉,这让人困惑。它实际上只是一个倒计时,将所选日期与当前日期进行比较。所以它应该显示“还有5天”之类的内容。@Chace超级简单。我更新了我的答案,并添加了一个函数来进行计算。我还迭代快照以输出接下来30天内的事件以及每个事件发生之前的天数。您需要对检索事件的时间有一定的限制,所以我在本例中使用了30天,但您可以轻松更改。非常感谢。很抱歉问一下,这听起来可能很愚蠢,但我是否在viewDidLoad中称之为此?因为这就是我所做的,并且没有打印出来:/它可能也与我的eventRef有关,因为我的eventRef需要通过用户ID进入usersList,所以它看起来是这样的:让eventRef=FIRDatabase.database().reference(路径为:“users/(user.uid)/usersList”)。另外,你能解释一下为什么需要对检索事件进行限制吗?@Chace对检索事件没有限制-我包含了该代码以演示如何进行操作-例如,如果是日历应用程序,用户只想在未来30天内查看事件。或者是一个待办事项列表,用户只想看看本周需要做什么。至于你的代码不起作用,这可能是由于很多原因造成的,但是如果你创建了一个新的应用程序(我就是这么做的),将我包含的结构放入Firebase并运行它起作用的代码(如输出所示)。您可能想提出另一个问题以获得Firebase返回数据的帮助。请查看我的更新。我有一个获取Firebase数据的函数,这样我就可以在tableView上显示名称和日期。那么我可以使用你的函数或类似的东西来获取日期和当前日期的差异吗?你能更新你的答案,使之与我的答案一致吗