Swift Date: как определить, может ли месяц иметь високосный день? - PullRequest
1 голос
/ 07 января 2020

Я строю представление календаря, которое я хочу быть агности c года, просто перечислите все возможные даты, которые могут произойти за месяц. Т.е. показать максимальное количество дней в календаре, например 29 февраля. Из этого ответа я знаю, что есть другие календарные системы, в которых также есть високосные дни, поэтому мне интересно, как я могу определить, есть ли у календаря високосный день, независимо от календарной системы или года , Любая помощь будет принята с благодарностью! Вот то, что у меня есть в настоящее время, чтобы получить количество дней в месяце:

func days(in month: Int) -> Int {
    let components = DateComponents(month: month+1, day: -1)
    let lastDay = Calendar.current.date(from: components)!
    return Calendar.current.dateComponents([.day], from: lastDay).day!+1
}

Это прекрасно работает, но основано на текущем году, который может не быть високосным.

Я видел isLeapMonth, но, похоже, это не работает для запроса так же, как .day.

1 Ответ

1 голос
/ 07 января 2020

изменить / обновить :

Вы можете получить следующий високосный год для текущего календаря и проверить максимальное количество дней в месяце, возможно, что-то вроде этого:

extension Date {

    var year: Int { Calendar.current.component(.year, from: self) }

    var isLeapYear: Bool { Calendar.current.range(of: .day, in: .year, for: self)!.count == 366 }

    // find the leap year
    static var leapYear: Int {
        var year = Date().year
        while DateComponents(calendar: .current, year: year).date?.isLeapYear == false {
            year += 1
        }
        return year
    }
}

Date.leapYear  // 2020

func maximumNumberOfDays(in month: Int) -> Int? {
    Calendar.current.range(of: .day,
                           in: .month,
                           for: DateComponents(calendar: .current,
                                               year: Date.leapYear,
                                               month: month).date!)?.count
}

maximumNumberOfDays(in: 2)  // 29
...