2016-09-12 43 views
3

我試圖計算兩個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

公共假日不需要區分。只需要計算兩個日期之間的週末和工作日的數量。 –

回答

6

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

這裏是迅速的第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) 
} 

}

相關問題