如果两个 NSDate 对象不相等,则替换 NSDate 值



基本上,我正在编写一个应用程序,我希望它的一些值每周更新一次-因此,使用NSDate和NSUserDefaults,我目前已经设置了这个场景:

let userDefaults = NSUserDefaults.standardUserDefaults()
var startOfWeek: NSDate?

以上为全球^

var referenceDate = NSDate.timeIntervalSinceReferenceDate()
while referenceDate > 604800 {
    if referenceDate > 604800 {
        referenceDate -= 604800
    }

这基本上取自2001年1月1日以来经过的秒数,减去604800,即一周内的秒数。这个秒数基本上就是你进入一周的秒数。

在这之后,我创建了一个变量,它刚好是我们一周中有多少秒的负数,一个变量是当前时间,并用它们创建一个新的日期对象,这是一周的起点:

var weekTimer: NSTimeInterval = (-referenceDate)
var startOfWeek = userDefaults.objectForKey("startOfWeekKey") as? NSDate
var currentTime = NSDate(timeIntervalSinceNow: 0)
if startOfWeek == nil {
    startOfWeek = NSDate(timeInterval: weekTimer, sinceDate: currentTime)
    userDefaults.objectForKey("startOfWeekKey")
}
else {
}

因此,基本上它会为一周的开始创建一个值,如果该值还不存在,则会将其保存到NSUserDefaults的键"startOfWeekKey"下。如果该值已经存在,因为它已经被保存,那么它对这个值很满意,不会发生任何事情。

现在,我们创建一个新值来与startOfWeek值进行比较,这样我们就可以测试是否进入新的一周。

var startOfWeekCheck = NSDate(timeInterval: weekTimer sinceDate: currentTime)

现在我们比较一下:

if startOfWeek! == startOfWeekCheck {
}
else {
println("New week begins") //update other, irrelevant stuff here 
startOfWeek = startOfWeekCheck
}

不管怎样,新的一周总是打印出来的,我添加了以下行来检查发生了什么:

println("(startOfWeek!) (startOfWeekCheck)")

它将相同的值打印到日志

我现在很不确定该怎么办。我搞砸了吗?你能不能不这样比较这两个日期对象?这是一种效率低下的方式来创造一种每周重置/更改一次的方法吗?

注意,这不是确切的代码,我手动键入了这些代码,因为代码在我的macbook上,我在桌面上,所以如果有任何拼写错误,不要担心,我的mac上没有编译错误。

谢谢!

这看起来太复杂了。没有必要自己计算所有的日期。尤其是因为你做错了。并不是每个星期都有604800秒。在许多时区,每年有一周有601200秒,一周有608400秒。也称为夏令时。甚至有些国家在一年中跳过了一整天。

您必须使用NSCalendarNSDateComponents进行正确的日期计算。

但我会做完全不同的事情:

  1. 在NSUserDefaults中保存下一个刷新日期(默认为distantPast)
  2. 如果今天>=下一个刷新日期:refresh&写入新的刷新日期

类似这样的东西:

let calendar = NSCalendar.currentCalendar()
// If nextRefreshDate was never written by us (i.e. first start of app) it will containt distantPast, which is in year 1 or so
NSUserDefaults.standardUserDefaults().registerDefaults(["nextRefreshDate" : NSDate.distantPast()])
// since we registered a default value we will always receive a valid NSDate object, so we can force unwrap
let nextRefreshDate = NSUserDefaults.standardUserDefaults().objectForKey("nextRefreshDate") as NSDate
// equivalent to: (nextRefreshDate < today) || (nextRefreshDate == today)
if nextRefreshDate.compare(NSDate()) != NSComparisonResult.OrderedDescending {
    println("Refresh")
    let refreshSuccess = true // get from your internet download code
    if refreshSuccess {
        // don't save the next refresh date until the refresh was actually sucessful. This makes sure that we refresh on next launch if this refresh fails for some reason
        var startOfCurrentWeek: NSDate?
        if calendar.rangeOfUnit(.CalendarUnitWeekOfMonth, startDate: &startOfCurrentWeek, interval: nil, forDate: NSDate()) {
            if let startOfCurrentWeek = startOfCurrentWeek {
                if let startOfNextWeek = calendar.dateByAddingUnit(.CalendarUnitWeekOfMonth, value: 1, toDate: startOfCurrentWeek, options: nil) {
                    NSUserDefaults.standardUserDefaults().setObject(startOfNextWeek, forKey: "nextRefreshDate")
                    println("Next refresh scheduled for (startOfNextWeek)")
                }
            }
        }
    }
}
else {
    println("No refresh necessary. Next refresh scheduled for (nextRefreshDate)")
}

最新更新