Search code examples
firebaseswift3nsdatecountdown

Countdown to a date. Swift 3 and Firebase


I'm wanting to use my Firebase database that has the values of a product i.e. lifespan (an integer not a date) and use it to compare the date in which the user has added the item i.e. 25/03/17, I'm not sure how to achieve this. Can somebody give me some advice. I believe it is to do with approximation, so if the liespan is equal 7 then the user should see 7 days and it would decrease each day, so basically a countdown. I've looked at NSDate documentation and the SwiftDate framework and do have a bit of knowledge on the methods I might need to use.

I have this example where it gets the engagement date and compares it with the wedding date, I'm thinking this is somewhat similar to what I want to try and achieve. However as this uses two dates and I want to use a date and an integer:

    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: [])

Hope I made sense, thank you in advance! :)


Solution

  • In response to a comment from the OP, this answers the question how to calculate

    time between two dates

    as well as perform a query on Firebase to retrieve events between now and a future date.

    Given a Firebase structure to track events:

    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"
    

    Assuming today is 20170402 (April 2nd, 2017) and we want all of the events for the next 30 days along with how many days until the event, when we run the following code and query:

        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)")
            }
        })
    

    and a little function do to the difference in dates calculation

    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)!
    }
    

    and the result is

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