计算两个NSDates之间的商务日和周末天数
问题描述:
我试图计算两个NSDates之间的工作日+工作日数量,但我似乎无法找到合适的解决方案。我目前可以找到两天之间的天数,例如:计算两个NSDates之间的商务日和周末天数
func reloadData(){
let cal = NSCalendar.currentCalendar()
var daysInt = 0
let days = cal.components(.Day, fromDate: selectedDateTimePointTwo, toDate: selectedDateTimePointOne, options: [])
daysInt = days.day
workDaysLabel.text = "work days: \(daysInt)"
weekendDaysLabel.text = "weekend days: "
}
任何人都可以指出我正确的方向吗?
答
首先,如果你使用的是斯威夫特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
}
}
答
这里是迅速的第4版。我还使用了当前设备的日历,而不是一个ISO
extension Date {
var tomorrow: Date? {
return Calendar.current.date(byAdding: .day,
value: 1,
to: self)
}
func daysCount(until date: Date) -> (weekendDays: Int, workingDays: Int) {
var weekendDays = 0
var workingDays = 0
var startDate = self
repeat {
if Calendar.current.isDateInWeekend(startDate) {
weekendDays += 1
} else {
workingDays += 1
}
if let tomorrow = startDate.tomorrow {
startDate = tomorrow
} else {
break
}
} while startDate < date
return (weekendDays, workingDays)
}
}
你可能会在这里找到一些有用的信息:http://nshipster.com/nscalendar-additions/ – jtbandes
做公众假期,如果他们在工作日下班,算作工作日? –
公共假日不需要区分。只需要计算两个日期之间的周末和工作日的数量。 –