Reputation: 561
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
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