Получить массив дат между сегодняшним днем ​​и данной датой в Swift? - PullRequest
3 голосов
/ 26 июня 2019

У меня есть дата в строковом формате, "гггг-ММ-дд", и я хочу вернуть массив разниц в датах в том же формате с сегодняшнего дня.

Например, указанная дата - «2019-06-29», а сегодняшняя дата - 2019-06-25. Возвращаемый массив будет содержать: ["2019-06-25", "2019-06-26", "2019-06-27", "2019-06-28", "2019-06-29"].

Метод, который я пытаюсь написать, также должен работать в месяцы / годы. Возможно ли что-то подобное в Swift?

Что я пробовал: Численный расчет разницы в датах (разность дней) и добавление дня к заданной дате, пока она не достигнет сегодняшней даты. Это то, что привело к вопросу о превышении 30/31 дня и отсутствии перехода к следующим месяцам / превышении 2019-12-31 и отсутствии перехода к 2020 году. Несомненно, существует более простой и краткий способ достижения этого результата без необходимости записывать эту дату логика вручную?

1 Ответ

1 голос
/ 26 июня 2019
extension Formatter {
    static let date: DateFormatter = {
        let dateFormatter = DateFormatter()
        dateFormatter.calendar = Calendar(identifier: .iso8601)
        dateFormatter.locale = Locale(identifier: "en_US_POSIX")
        dateFormatter.dateFormat = "yyyy-MM-dd"
        return dateFormatter
    }()
}

extension Date {
    var noon: Date {
        return Calendar.current.date(bySettingHour: 12, minute: 0, second: 0, of: self)!
    }
}

func dates(for date: String) -> [String] {    
    // For calendrical calculations you should use noon time
    // So lets get endDate's noon time
    guard let endDate = Formatter.date.date(from: date)?.noon else { return [] }
    // then lets get today's noon time
    var date = Date().noon
    var dates: [String] = []
    // while date is less than or equal to endDate
    while date <= endDate {
        // add the formatted date to the array
        dates.append( Formatter.date.string(from: date))
        // increment the date by one day
        date = Calendar.current.date(byAdding: .day, value: 1, to: date)!
    }
    return dates
}

dates(for: "2019-06-29")  // ["2019-06-25", "2019-06-26", "2019-06-27", "2019-06-28", "2019-06-29"]
...