算法不是很壮观:
- 计算本周开始
- 使用 1 的结果来计算下周开始
- 使用 2 的结果来计算下周之后的一周开始
- 如果日期在下周开始或之后,并且在下周之后的一周开始之前,则日期为下周
NSCalendar 为我们完成了大部分工作。但它看起来还是有点吓人,至少如果你不经常使用这些日期方法的话。您应该阅读所有这些方法的文档以了解它们。
let calendar = NSCalendar.currentCalendar()
let date = NSDate()
var startOfThisWeek: NSDate?
if !calendar.rangeOfUnit(.CalendarUnitWeekOfMonth, startDate: &startOfThisWeek, interval: nil, forDate: date) {
fatalError("Can't calculate start of this week")
}
let startOfNextWeek = calendar.dateByAddingUnit(.CalendarUnitWeekOfMonth, value: 1, toDate: startOfThisWeek!, options: nil)!
let startOfNextNextWeek = calendar.dateByAddingUnit(.CalendarUnitWeekOfMonth, value: 1, toDate: startOfNextWeek, options: nil)!
只需将.CalendarUnitWeekOfMonth 与.CalendarUnitMonth 切换,您就可以获得下个月和下个月的计算。
var startOfThisMonth: NSDate?
if !calendar.rangeOfUnit(.CalendarUnitMonth, startDate: &startOfThisMonth, interval: nil, forDate: date) {
fatalError("Can't calculate start of this month")
}
let startOfNextMonth = calendar.dateByAddingUnit(.CalendarUnitMonth, value: 1, toDate: startOfThisMonth!, options: nil)!
let startOfNextNextMonth = calendar.dateByAddingUnit(.CalendarUnitMonth, value: 1, toDate: startOfNextMonth, options: nil)!
还有测试:
let testDate = NSDate(timeIntervalSinceNow: 7*24*60*60)
if startOfThisWeek <= testDate && testDate < startOfNextWeek {
println("\(testDate) is this week")
}
if startOfNextWeek <= testDate && testDate < startOfNextNextWeek {
println("\(testDate) is next week")
}
if startOfThisMonth <= testDate && testDate < startOfNextMonth {
println("\(testDate) is this month")
}
if startOfNextMonth <= testDate && testDate < startOfNextNextMonth {
println("\(testDate) is next month")
}
结果:
“2015-03-22 02:55:19 +0000 是下周”
"2015-03-22 02:55:19 +0000 是这个月"
听起来不错。
如果您想使用<=、==、< 等而不是丑陋(且令人困惑)NSComparisonResult,您也需要这个:
public func ==(lhs: NSDate, rhs: NSDate) -> Bool {
return lhs === rhs || lhs.compare(rhs) == .OrderedSame
}
public func <(lhs: NSDate, rhs: NSDate) -> Bool {
return lhs.compare(rhs) == .OrderedAscending
}
extension NSDate: Comparable { }
这是 iOS8 代码。如果你想编写适用于旧版本的代码,你必须用旧的 NSDateComponents 替换 dateByAddingUnit:value::toDate:options:。即:
let offSetComponents = NSDateComponents()
offSetComponents.weekOfMonth = 1
let startOfNextWeek = calendar.dateByAddingComponents(offSetComponents, toDate: startOfThisWeek, options: nil)