如何检查两个NSDates之间的时间量?

时间:2017-03-30 19:25:21

标签: ios swift date swift3

我制作了一种基于挑战的应用,要求用户每天都回来。如果有一天他错过了,他必须重新开始。 我的问题是我的dateChanged() - 函数;第一件事是,它不起作用非常可靠,第二件事是我只是检查日期是否发生变化,因此我不知道在使用该应用程序之间是否有一两天的时间。 这是我目前的职能:

public func changeDays()
{
    myFormatter.dateStyle = .short
    myFormatter.locale = Locale(identifier: "de_DE")

    oldDate = defaults.string(forKey: "oldDate")!
    let newDate = Date()
    let newDateString = myFormatter.string(from: newDate)

    if newDateString == oldDate
    {
        NumberOfDaysInARow.text = "\(days) / 30"
    }
    else if newDateString != oldDate
    {
        days += 1
        NumberOfDaysInARow.text = "\(days) / 30"
        defaults.set(days, forKey: "days")
    }

    oldDate = newDateString
    defaults.set(oldDate, forKey: "oldDate")


}

就在今天,它开始给我一个致命的错误,当我在我的iPhone上启动应用程序时,虽然没有发生在模拟器中......很奇怪。 我如何更改我的功能,使其100%可靠(和工作),同时还能检查两个日期之间的时间量?

感谢您一看!祝你有美好的一天

2 个答案:

答案 0 :(得分:0)

如果您查看文档,您会看到Date有一种方法,其唯一目的是确定两个日期time​Interval​Since(_:​)之间的间隔。

如果您将旧日期设置为上次使用当天晚上11:59,则只需查看间隔是否大于24小时(60秒* 60分钟* 24小时)。 / p>

您可能需要查看DateComponents的文档,以获取有关创建使用当前日期但具有特定时间的日期的帮助。

答案 1 :(得分:0)

您可以使用下面的函数扩展日期,该函数返回另一个日期的天数。

extension Date {

  // Returns the amount of days from another date
  func days(from date: Date) -> Int {
    return Calendar.current.dateComponents([.day], from: date, to: self).day ?? 0
  }
}

不是将oldDate保存为字符串,而是将其设置为默认值为日期:

defaults.set(Date(), forKey: "oldDate")

您可以使用以下方式从默认值中获取旧日期:

let oldDate = defaults.object(forKey:"oldDate") as! Date

一旦你有了旧日期

let dateNow = Date()

let timeDifference = dateNow.days(from: oldDate!)

If timeDifference > 1 {
 // older than 1 day
  } else {
  // Streak still alive 
  }
}