Chace
Chace

Reputation: 561

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

Upvotes: 1

Views: 787

Answers (1)

Jay
Jay

Reputation: 35648

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

Upvotes: 1

Related Questions