日期倒计时。 Swift 3 和 Firebase
Countdown to a date. Swift 3 and Firebase
我想使用我的 Firebase 数据库,它具有产品的值,即寿命(整数而不是日期),并用它来比较用户添加项目的日期,即 25/03/ 17,我不确定如何实现这一点。有人可以给我一些建议吗?我相信这与近似值有关,所以如果 liespan 等于 7,那么用户应该看到 7 天并且每天都会减少,所以基本上是 countdown。我查看了 NSDate 文档和 SwiftDate 框架,对我可能需要使用的方法有一些了解。
我有这个例子,它获取订婚日期并将其与结婚日期进行比较,我认为这与我想要尝试实现的有点相似。但是,因为这使用了两个日期,而我想使用一个日期和一个整数:
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 的评论,这回答了如何计算的问题
time between two dates
以及在 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
我想使用我的 Firebase 数据库,它具有产品的值,即寿命(整数而不是日期),并用它来比较用户添加项目的日期,即 25/03/ 17,我不确定如何实现这一点。有人可以给我一些建议吗?我相信这与近似值有关,所以如果 liespan 等于 7,那么用户应该看到 7 天并且每天都会减少,所以基本上是 countdown。我查看了 NSDate 文档和 SwiftDate 框架,对我可能需要使用的方法有一些了解。
我有这个例子,它获取订婚日期并将其与结婚日期进行比较,我认为这与我想要尝试实现的有点相似。但是,因为这使用了两个日期,而我想使用一个日期和一个整数:
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 的评论,这回答了如何计算的问题
time between two dates
以及在 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