首先,如果你使用的是斯威夫特2,你應該做的NSDate符合可比協議:
extension NSDate: Comparable { }
public func <(lhs: NSDate, rhs: NSDate) -> Bool {
return lhs.compare(rhs) == .OrderedAscending
}
其次,您可以使用NSCalendar isDateWeekend檢查,如果任何日期是週末一天或沒有,你可以使用dateByAddingUnit得到增加一天的開始之日起至終止日期:
創建這些擴展,以幫助您:
struct Cal {
static let iso8601 = NSCalendar(identifier: NSCalendarIdentifierISO8601)!
}
extension NSDate {
var isDateWeekend: Bool {
return Cal.iso8601.isDateInWeekend(self)
}
var tomorrow: NSDate {
return Cal.iso8601.dateByAddingUnit(.Day, value: 1, toDate: self, options: .MatchNextTime)!
}
}
和方法計數d AYS:
func coutDays(from start: NSDate, to end: NSDate) -> (weekendDays: Int, workingDays: Int) {
guard start < end else { return (0,0) }
var weekendDays = 0
var workingDays = 0
var date = start
repeat {
if date.isDateWeekend {
weekendDays += 1
} else {
workingDays += 1
}
date = date.tomorrow
} while date < end
return (weekendDays, workingDays)
}
測試:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let start = Cal.iso8601.dateFromComponents(NSDateComponents(year: 2016))! // "Jan 1, 2016, 12:00 AM"
let end = Cal.iso8601.dateFromComponents(NSDateComponents(year: 2017))! // "Jan 1, 2017, 12:00 AM"
print(coutDays(from: start, to: end)) // 105, 261
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
extension NSDateComponents {
convenience init(year: Int) {
self.init()
self.year = year
}
}
你可能會在這裏找到一些有用的信息:http://nshipster.com/nscalendar-additions/ – jtbandes
做公衆假期,如果他們在工作日下班,算作工作日? –
公共假日不需要區分。只需要計算兩個日期之間的週末和工作日的數量。 –