【问题标题】:Get array of dates between today and given date in Swift?在 Swift 中获取今天和给定日期之间的日期数组?
【发布时间】:2019-11-07 20:41:59
【问题描述】:

我有一个字符串格式的日期,“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 的问题的原因。当然有一种更简单简洁的方法可以实现此结果,而无需编写该日期手动逻辑?

【问题讨论】:

  • 首先将String解析为Date对象,然后使用Calendar系统在解析后的Date和今天之间穿行
  • 你确定你真的需要一个数组吗?还是您只需要一种能够枚举天数的方法?

标签: swift date nsdate nsdateformatter


【解决方案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"]

【讨论】:

  • 像魅力一样工作。写得很精彩。谢谢。
  • 只是一个后续问题:如果我想获取从今天到给定日期 +1 天的日期(2019-06-29 返回的数组将包括最多 2019-06-30),其中将是增加额外一天的最佳地点吗?我将如何处理?
  • @ahjnar 只需在警卫之后的 endDate 中添加一天。 func dates(for date: String) -&gt; [String] { guard var endDate = Formatter.date.date(from: date)?.noon else { return [] } endDate = Calendar.current.date(byAdding: .day, value: 1, to: endDate)! var date = Date().noon var dates: [String] = [] while date &lt;= endDate { dates.append( Formatter.date.string(from: date)) date = Calendar.current.date(byAdding: .day, value: 1, to: date)! } return dates }
猜你喜欢
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多