首页 > 解决方案 > Swift:如何使用自定义谓词检查日期是否连续

问题描述

我正在尝试编写一个函数来检查数组中的日期(因此键入 Date)是否是连续的,同时排除一周中的某些天(可以是任何天,例如 [1,4,6] 或 [] 或 [1, 2,3,4,5])。这个答案有一个不包括周末的谓词,但我没有设法修改这种方法以采用 .weekday 数组

任何建议将不胜感激。

标签: arraysswiftdatecalendar

解决方案


这是一个构建的基本解决方案,它将日期转换为工作日数组([Int]),然后使用 for 循环来验证数组。

let secondsPerDay = 24.0 * 60.0 * 60.0
var dates = [Date(timeIntervalSinceNow: -2.0 * secondsPerDay),
             Date(timeIntervalSinceNow: -1.0 * secondsPerDay),
             Date(),
             Date(timeIntervalSinceNow: 2 * secondsPerDay),
             Date(timeIntervalSinceNow: 3 * secondsPerDay),]

let calendar = Calendar.current
let excluded = [5, 6]

var weekdays = dates.map {calendar.component(.weekday, from: $0)}
var prev = weekdays.first!  //Change to a guard statement or similar
var isConsecutive = true

for index in 1..<weekdays.count {
    let weekday = weekdays[index]
    let previousWeekday = prev > weekday ? prev - 7 : prev

    if previousWeekday + 1 == weekday || excluded.contains(previousWeekday + 1) {
        prev = weekday
        continue
    }

    isConsecutive = false
    break
}

print("Date array is \(isConsecutive ? "" : "not ")consecutive" )

推荐阅读