【问题标题】:Countdown to a date. Swift 3 and Firebase日期倒计时。 Swift 3 和 Firebase
【发布时间】:2017-03-26 00:59:02
【问题描述】:

我想使用具有产品值的 Firebase 数据库,即寿命(整数而不是日期),并使用它来比较用户添加项目的日期,即 25/03/17,我不确定如何实现这一目标。有人可以给我一些建议。我相信这与近似值有关,所以如果 Liespan 等于 7,那么用户应该看到 7 天,并且每天都会减少,所以基本上是一个 倒计时。我查看了 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: [])

希望我有道理,提前谢谢你! :)

【问题讨论】:

  • 只是为了确定,在您的数据库中,您有一个生命周期值(整数)和添加项目的日期(日期),对吗?如果是,您需要做的就是获取当前日期并找出日期之间的差异,以查看自添加项目以来已经过去了多少天。一旦达到寿命值,您可能会停止倒计时。我可以为你提供代码,如果这会让它更容易,但这应该会有所帮助 - stackoverflow.com/questions/31132159/…
  • 你想让它每天倒计时吗?
  • @Fahim,是的,你是对的,倒计时将在它达到其使用寿命后立即停止。我知道这可以应用于任何数据库,但你能向我展示使用 Firebase 的方法吗?所以目前我可以将购买商品的日期发送到数据库。但是我刚刚意识到用户正在提供这些数据,所以它不起作用。我一直试图让它只让用户选择表中的数据。如果这有任何意义。
  • @Chace 恐怕最后一点对我来说根本没有任何意义 :) 但你可能有一个与我完全不同的实现。从我坐的地方,如果数据在表中,您应该能够获取它,如果您可以获取数据,您可以进行计算并显示结果。但由于我不知道你的想法,我可能完全错了:)
  • @Fahim 基本上现在我可以创建一个事件并给它一个日期值。但我意识到这是错误的方法。我应该做的就像你提到的那样,即获取数据并根据用户设置的日期进行计算。我对 Firebase 很陌生,所以目前我只能获取用户添加的数据的快照并将其显示到 tableView 上。但是现在我需要显示具有生命周期的数据表。

标签: firebase swift3 nsdate countdown


【解决方案1】:

响应 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

【讨论】:

  • 很抱歉延迟回复。我实际上想显示距离事件还有多少天,而不是事件直到某个日期。对不起,如果这令人困惑。它实际上只是一个倒计时,将所选日期与当前日期进行比较。所以它应该显示“还有 5 天”。
  • @Chace 超级简单。我更新了我的答案并添加了一个函数来进行计算。我还遍历快照以输出接下来 30 天内的事件以及每个事件之前的天数。您需要对检索事件的距离有一些限制,因此我在此示例中使用了 30 天,但您可以轻松更改它。
  • 非常感谢。抱歉问,这听起来可能很愚蠢,但我是否在 viewDidLoad 中调用它?因为这就是我所做的并且没有打印出来:/它可能也与我的 eventRef 有关,因为我需要通过用户 ID 访问 usersList,所以它看起来像这样:let eventRef = FIRDatabase.database()。参考(withPath:“用户/(user.uid)/usersList”)。另外,您能否解释一下为什么需要对检索事件进行限制?
  • @Chace 检索事件没有限制 - 我包含该代码以演示如何完成它 - 假设它是一个日历应用程序并且用户只想查看未来 30 天内的事件.或者可能是一个待办事项列表,用户只想查看本周需要完成的事情。至于您的代码不起作用,这可能是由于很多原因,但如果您创建一个新应用程序(这就是我所做的),请将我包含的结构放入 Firebase 并运行它工作的代码(如输出)。您可能需要设计另一个问题以获得有关从 Firebase 返回数据的帮助。
  • 请看我的更新。我有这个函数可以获取我的 Firebase 数据,这样我就可以在 tableView 上显示名称和日期。那么我可以使用您的功能或类似的功能来获取日期和当前日期的差异吗?您能否更新您的答案,以便它适用于我的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多