两个Date对象之间的所有日期(Swift)

ixa*_*any 20 nsdate nsdateformatter nscalendar nsdatecomponents swift

我正在创建一个日期NSDateComponents().

let startDate = NSDateComponents()
startDate.year = 2015
startDate.month = 9
startDate.day = 1
let calendar = NSCalendar.currentCalendar()
let startDateNSDate = calendar.dateFromComponents(startDate)!
Run Code Online (Sandbox Code Playgroud)

...现在我要打印自startDate今天以来的所有日期,NSDate().我已经尝试过玩NSCalendarUnit,但它只输出整个差异,而不是单个日期.

let unit: NSCalendarUnit = [.Year, .Month, .Day, .Hour, .Minute, .Second]
let diff = NSCalendar.currentCalendar().components(unit, fromDate: startDateNSDate, toDate: NSDate(), options: [])
Run Code Online (Sandbox Code Playgroud)

如何在两个Date对象之间打印所有日期?

编辑2019

与此同时,课程的命名已经改变 - NSDate现在只是Date.NSDateComponents现在被称为DateComponents.NSCalendar.currentCalendar()现在只是Calendar.current.

Mar*_*n R 53

只需在日期中添加一天的单位,直到达到当前日期(Swift 2代码):

var date = startDateNSDate // first date
let endDate = NSDate() // last date

// Formatter for printing the date, adjust it according to your needs:
let fmt = NSDateFormatter()
fmt.dateFormat = "dd/MM/yyyy"

// While date <= endDate ...
while date.compare(endDate) != .OrderedDescending {
    print(fmt.stringFromDate(date))
    // Advance by one day:
    date = calendar.dateByAddingUnit(.Day, value: 1, toDate: date, options: [])!
}
Run Code Online (Sandbox Code Playgroud)

Swift 3更新:

var date = startDate // first date
let endDate = Date() // last date

// Formatter for printing the date, adjust it according to your needs:
let fmt = DateFormatter()
fmt.dateFormat = "dd/MM/yyyy"

while date <= endDate {
    print(fmt.string(from: date))
    date = calendar.date(byAdding: .day, value: 1, to: date)!
}
Run Code Online (Sandbox Code Playgroud)

  • @Martin:我收到此错误“二进制运算符'&lt;='无法应用于两个'NSDate'操作数”。请帮我。 (2认同)

A.G*_*A.G 18

使用扩展名:

extension Date {
    static func dates(from fromDate: Date, to toDate: Date) -> [Date] {
        var dates: [Date] = []
        var date = fromDate

        while date <= toDate {
            dates.append(date)
            guard let newDate = Calendar.current.date(byAdding: .day, value: 1, to: date) else { break }
            date = newDate
        }
        return dates
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

let datesBetweenArray = Date.dates(from: Date(), endDate: Date())
Run Code Online (Sandbox Code Playgroud)


Ale*_*erZ 7

同样的事情,但更漂亮:

extension Date {

  func allDates(till endDate: Date) -> [Date] {
    var date = self
    var array: [Date] = []
    while date <= endDate {
      array.append(date)
      date = Calendar.current.date(byAdding: .day, value: 1, to: date)!
    }
    return array
  }
}
Run Code Online (Sandbox Code Playgroud)

如何获取接下来 20 天的所有日期:

if let date = Calendar.current.date(byAdding: .day, value: 20, to: Date()) {
  print(Date().allDates(till: date))
}
Run Code Online (Sandbox Code Playgroud)


Nik*_*ani 5

这是打印两个日期之间的所有日期的解决方案(Swift 4 代码)

var mydates : [String] = []
var dateFrom =  Date() // First date
var dateTo = Date()   // Last date

// Formatter for printing the date, adjust it according to your needs:
let fmt = DateFormatter()
fmt.dateFormat = "yyy-MM-dd"
dateFrom = fmt.date(from: strstartDate)! // "2018-03-01"
dateTo = fmt.date(from: strendDate)! // "2018-03-05"


while dateFrom <= dateTo {
    mydates.append(fmt.string(from: dateFrom))
    dateFrom = Calendar.current.date(byAdding: .day, value: 1, to: dateFrom)!

}

print(mydates) // Your Result
Run Code Online (Sandbox Code Playgroud)

输出是:

["2018-03-01", "2018-03-02", "2018-03-03", "2018-03-04", "2018-03-05"]
Run Code Online (Sandbox Code Playgroud)