如何在一个月的计算中提高工作日数的准确性?

时间:2019-04-04 21:47:54

标签: ios swift

我正在尝试计算一个月中一周中的每一天有多少天。我已将以下问题/答案用作我要达到的目标的基础,并且在大多数情况下都有效。

how can we get the number of sundays on an given month ? ( swift )

不幸的是,如果是工作日,它还会计算下个月的第一天。

我对代码的计算方式不太熟悉,无法理解我是否可以在每月的总天数中添加-1或其他内容。

如果有人可以推荐解决方案,将不胜感激。

我曾尝试将“ numberOfSundays + = 1”更改为“ numberOfSundays + = 0”,因为我认为这可能是导致问题的原因。

func getNumberOfDaysInMonth (month : Int, Year : Int, nameOfDay: String) -> Int? {

    var dateComponents = DateComponents()
    dateComponents.year = Year
    dateComponents.month = month

    let calendar = NSCalendar.current
    let date = calendar.date(from: dateComponents)

    guard let range = calendar.range(of: .day, in: .month, for: date!) else { return nil }

    let numDays = range.endIndex

    // New code starts here:

    var numberOfSundays = 0

    let dateFormatter = DateFormatter()

    for day in 1...numDays {

        dateComponents.day = day

        guard let date = calendar.date(from: dateComponents) else { return nil }

        dateFormatter.dateFormat = "EEEE"
        let dayOfWeek = dateFormatter.string(from: date) // Get day of week

        if dayOfWeek == nameOfDay { // Check if it's a Monday
            numberOfSundays += 1
        }
    }

    return numberOfSundays
}

getNumberOfDaysInMonth(month: 06, Year: 2019, nameOfDay: "Monday")

getNumberOfDaysInMonth(month: 06, Year: 2019, nameOfDay: "Tuesday")

getNumberOfDaysInMonth(month: 06, Year: 2019, nameOfDay: "Wednesday")

getNumberOfDaysInMonth(month: 06, Year: 2019, nameOfDay: "Thursday")

getNumberOfDaysInMonth(month: 06, Year: 2019, nameOfDay: "Friday")

在我将函数称为“ getNumberOfDaysInMonth(month:06,Year:2019,nameOfDay:“ Monday”)“的情况下,它返回5作为2019年6月的天数,实际上是4。

2 个答案:

答案 0 :(得分:0)

func getNumberOfDaysInMonth(month: Int , year: Int, nameOfDay: String) -> Int? {

    var components = DateComponents()
    components.year = year
    components.month = month

    let calendar = Calendar.current

    guard let date = calendar.date(from: components),
        let range = calendar.range(of: .day, in: .month, for: date) else { return nil }

    return range
        .map { DateComponents(year: year, month: month, day: $0) }
        .map { calendar.date(from: $0) }
        .compactMap { date  -> String? in
            guard let date = date else { return nil }
            let dateFormatter = DateFormatter()
            dateFormatter.dateFormat = "EEEE"
            return dateFormatter.string(from: date)
        }
        .filter { $0 == nameOfDay }
        .count
}

答案 1 :(得分:0)

Range的文档中很难找到,但是.endIndex属性的文档注释为:

  

集合的“过去”位置,即位置比最后一个有效的下标参数大一个。

无论如何,您不应该使用索引来计算大小。 正确地,您应该使用:

let numDays = range.upperBound - range.lowerBound

或者简单地

let numDays = range.count

正确计算天数。