计算两个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: " 
} 

任何人都可以指出我正确的方向吗?

+0

你可能会在这里找到一些有用的信息:http://nshipster.com/nscalendar-additions/ – jtbandes

+0

做公众假期,如果他们在工作日下班,算作工作日? –

+0

公共假日不需要区分。只需要计算两个日期之间的周末和工作日的数量。 –

首先,如果你使用的是斯威夫特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) 
} 

}