Swift - поиск nextDate () по дням года - PullRequest
0 голосов
/ 25 августа 2018

Надеюсь на помощь в этом. Я пытаюсь выполнить поиск (вперед и назад), чтобы найти следующую дату, которая соответствует дню года

Так, например, у меня есть значение дня 300, я знаю, что мы находимся на 237-м дне этого года (на момент написания этого поста, 25.08.18!), И я хочу искать в обратном направлении, чтобы найти предыдущее вхождение 300-го дня года и форматирование даты из него.

Я уже извлекаю «день года» из даты, используя небольшое расширение даты:

extension Date {
    var dayOfYear: Int {
        return Calendar.current.ordinality(of: .day, in: .year, for: self)!
    }
}

Используя функцию Calendar.nextDate (), я могу искать, чтобы соответствовать '.day', но это, очевидно, день месяца, а не год:

let potentialSartDate = (Calendar.current as NSCalendar).nextDate(after: nowDate, matching: .day, value: dayOfYearValueToMatch, options: [.matchNextTime, .searchBackwards])!

Есть ли у кого-нибудь какие-либо указатели или подходы, как выполнить поиск, подобный этому, построить дату из результата?

Заранее спасибо!

Emile

1 Ответ

0 голосов
/ 25 августа 2018

Вы можете получить компонент текущего года с сегодняшнего дня и использовать метод Calendar date(from: DateComponents), чтобы получить 300-й день года следующим образом:

extension Calendar {
    static let iso8601 = Calendar(identifier: .iso8601)
}
extension Date {
    var year: Int {
        return Calendar.current.component(.year, from: self)
    }
    var last300ThDayOfYear: Date {
        return Calendar.current.date(from: DateComponents(calendar: .iso8601, year: dayOfYear > 300 ? year  : year - 1, day: 300))!
    }
    var dayOfYear: Int {
        return Calendar.current.ordinality(of: .day, in: .year, for: self)!
    }
}

let date = Date().last300ThDayOfYear  // "Oct 27, 2017 at 12:00 AM"
print(date.dayOfYear)  // 300
...