计算2个NSDates之间的工作日和周末天数

时间:2016-09-12 02:18:30

标签: swift date calendar nsdate nscalendar

我正在尝试计算2个NSDates之间的工作日+工作日数,但我似乎找不到合适的解决方案。我现在可以找到2个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 个答案:

答案 0 :(得分:7)

首先,如果您使用的是Swift 2,您应该使NSDate符合Comparable协议:

extension NSDate: Comparable { }

public func <(lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.compare(rhs) == .OrderedAscending
}

其次,你可以使用Calendar isDateInWeekend来检查它是否是一个周末的日期,并且你可以使用dateByAddingUnit将一天添加到开始日期直到结束日期:

创建这些扩展程序以帮助您:

编辑/更新:Swift 4

extension Calendar {
    static let iso8601 = Calendar(identifier: .iso8601)
}


extension Date {
    var isDateInWeekend: Bool {
        return Calendar.iso8601.isDateInWeekend(self)
    }
    var tomorrow: Date {
        return Calendar.iso8601.date(byAdding: .day, value: 1, to: noon)!
    }
    var noon: Date {
        return Calendar.iso8601.date(bySettingHour: 12, minute: 0, second: 0, of: self)!
    }
}

以及计算天数的方法:

func coutDays(from start: Date, to end: Date) -> (weekendDays: Int, workingDays: Int) {
    guard start < end else { return (0,0) }
    var weekendDays = 0
    var workingDays = 0
    var date = start.noon
    repeat {
        if date.isDateInWeekend {
            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 = DateComponents(calendar: .iso8601, year: 2016).date!  // "Jan 1, 2016, 12:00 AM"
        let end = DateComponents(calendar: .iso8601, year: 2017).date!  // "Jan 1, 2017, 12:00 AM"
        print(coutDays(from: start, to: end))  // 105, 261
    }
}

答案 1 :(得分:1)

这是swift 4版本。我还使用了当前的设备日历而不是iso的

this

}