查找NSDate以查找任何日期的下一个最接近的特定日期

Bar*_*zyk 8 cocoa cocoa-touch nsdate date-arithmetic

我们假设今天是星期三.我可以打破NSDate一下NSDateComponents,但我需要找到NSDate下一个即将到来的星期一.如果今天是星期一,则下一个即将到来的星期一是今天.什么是实现这一目标的正确方法?

San*_*eep 24

您可以使用对象上的nextDateAfterDate:方法NSCalendar来实现此目的,

let now = Date() // today

var matchingComponents = DateComponents()
matchingComponents.weekday = 2 // Monday

let comingMonday =  Calendar.current.nextDate(after: now,
                                              matching: matchingComponents,
                                              matchingPolicy:.nextTime)
Run Code Online (Sandbox Code Playgroud)

在这里,是一个查找下一个星期一的简单方法.如果今天是星期一,则以下函数今天返回,否则最接近下周一.请注意,它使用en_POSIX_US,以便可以匹配日期.当语言环境为en_POSIX_US时,工作日符号变为,

["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
Run Code Online (Sandbox Code Playgroud)

而且,这是如何使用这些日子,

func findNext(_ day: String, afterDate date: Date) -> Date? {

    var calendar = Calendar.current
    calendar.locale = Locale(identifier: "en_US_POSIX")

    let weekDaySymbols = calendar.weekdaySymbols
    let indexOfDay = weekDaySymbols.index(of: day)

    assert(indexOfDay != nil, "day passed should be one of \(weekDaySymbols), invalid day: \(day)")

    let weekDay = indexOfDay! + 1

    let components = calendar.component(.weekday, from: date)

    if components == weekDay {
        return date
    }

    var matchingComponents = DateComponents()
    matchingComponents.weekday = weekDay // Monday

    let nextDay = calendar.nextDate(after: date,
                                    matching: matchingComponents,
                                    matchingPolicy:.nextTime)
    return nextDay!
}


let nextMonday = findNext("Monday", afterDate: Date())
let mondayAfterThat = findNext("Monday", afterDate: nextMonday!)

let thursday = findNext("Thursday", afterDate: mondayAfterThat!)
Run Code Online (Sandbox Code Playgroud)

  • 令人惊讶的是,"NSCalendar"的iOS 8方法仍未在参考库上进行记录. (2认同)