在Swift中获取今天到给定日期之间的日期数组?

时间:2019-06-26 00:42:18

标签: swift date nsdate nsdateformatter

我有一个字符串格式的日期“ yyyy-MM-dd”,并希望从今天开始以相同的格式返回日期差的数组。

例如,给定日期为“ 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 个答案:

答案 0 :(得分:1)

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"]