如何在阵列中查看连续的工作日



我在下面的函数(日期),该函数在一系列日期中循环循环,并首先删除任何条目,如果每天有多个条目,然后检查日期是否在数组中是否连续,从当前日期返回连续天数。

func datesCheck(_ dateArray: [Date]) -> Int {
    let calendar = Calendar.current
    let uniqueDates = NSSet(array: dateArray.map { calendar.startOfDay(for: $0) }).sorted {
    ($0 as AnyObject).timeIntervalSince1970 > ($1 as AnyObject).timeIntervalSince1970
    } as! [Date]
         var lastDate = calendar.startOfDay(for: Date())
         var i = 0
     while i < uniqueDates.count && uniqueDates[i].compare(lastDate) == .orderedSame {
              lastDate = (calendar as NSCalendar).date(byAdding: .day, value: -1, to: lastDate, options: [])!
              i += 1
    }
    numberOfConsecutiveDays = i
    return i
}

此功能运行良好,但我只想将其应用于星期一至周五的日期,连续日期检查器在星期五至星期一进行检查,实际上无视周六和周日。我试图使用calendar.com来实现这一目标,但在检查日期是否连续排除周末时找不到忽略周末的方法。

 let today = Date()
 let calendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)
 let components = calendar!.components([.weekday], fromDate: today)
 if components.weekday == 2 {
           print("Monday")
 } else {
           print("Monday")
 }

一个点:

  • 由于您不需要周末,请过滤掉

  • 您的功能是非确定性的,因为它使用了当前时间(Date())。从理论上讲,每个运行的结果都是不同的。我添加了第二个参数fromDate以使其确定性。


func datesCheck(_ dates: [Date], fromDate: Date = Date()) -> Int {
    let calendar = Calendar.current
    let weekdays = dates.map { calendar.startOfDay(for: $0) }
                    .filter { 2...6 ~= calendar.component(.weekday, from: $0) } 
    let uniqueDates = Set(weekdays).sorted(by: >)
    var i = 0       
    var lastDate = calendar.startOfDay(for: fromDate)
    while i < uniqueDates.count && uniqueDates[i] == lastDate {
        switch calendar.component(.weekday, from: uniqueDates[i]) {
        case 2:
            // When the lastDate is a Monday, the previous weekday is 3 days ago
            lastDate = calendar.date(byAdding: .day, value: -3, to: lastDate)!
        default:
            // Otherwise, it's 1 day ago
            lastDate = calendar.date(byAdding: .day, value: -1, to: lastDate)!
        }
        i += 1
    }
    return i
}

测试:

let dates = [
    DateComponents(calendar: .current, year: 2017, month: 8, day: 29).date!,
    DateComponents(calendar: .current, year: 2017, month: 8, day: 28).date!,
    DateComponents(calendar: .current, year: 2017, month: 8, day: 25).date!,
    DateComponents(calendar: .current, year: 2017, month: 8, day: 24).date!,
    DateComponents(calendar: .current, year: 2017, month: 8, day: 22).date!,
    DateComponents(calendar: .current, year: 2017, month: 8, day: 21).date!
]
let today = DateComponents(calendar: .current, year: 2017, month: 8, day: 29).date!
print(datesCheck(dates, fromDate: today)) // 4

代码打印4,因为根据周末规则忽略了28和25之间的差距。

最新更新