webentwicklung-frage-antwort-db.com.de

Alle Daten zwischen zwei Date-Objekten (Swift)

Ich erstelle mit NSDateComponents() ein Datum.

let startDate = NSDateComponents()
startDate.year = 2015
startDate.month = 9
startDate.day = 1
let calendar = NSCalendar.currentCalendar()
let startDateNSDate = calendar.dateFromComponents(startDate)!

... jetzt möchte ich alle Daten seit der startDate bis heute NSDate() ausdrucken. Ich habe bereits versucht, mit NSCalendarUnit zu spielen, aber es wird nur der gesamte Unterschied ausgegeben, nicht die einzelnen Daten.

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

Wie kann ich alle Daten zwischen zwei Dateobjects drucken?

Bearbeiten Sie 2019

Inzwischen hat sich die Benennung der Klassen geändert - NSDate ist jetzt nur noch Date. NSDateComponents heißt jetzt DateComponents. NSCalendar.currentCalendar() ist jetzt nur Calendar.current.

16
ixany

Fügen Sie einfach eine Tageseinheit zu dem Datum hinzu, bis es das aktuelle Datum erreicht (Swift-2-Code):

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: [])!
}

Update für 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)!
}
50
Martin R

Erweiterung verwenden:

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
    }
}

Verwendungszweck:

let datesBetweenArray = Date.dates(from: Date(), endDate: Date())
12
A.G

Gleiches aber hübscher:

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
  }
}

So erhalten Sie alle Termine für die nächsten 20 Tage:

if let date = Calendar.current.date(byAdding: .day, value: 20, to: Date()) {
  print(Date().allDates(till: date))
}
3
AlexanderZ

Ich verwende diesen Ansatz (Swift 3):

import Foundation

class Dates {
    static func printDatesBetweenInterval(_ startDate: Date, _ endDate: Date) {
        var startDate = startDate
        let calendar = Calendar.current

        let fmt = DateFormatter()
        fmt.dateFormat = "yyyy-MM-dd"

        while startDate <= endDate {
            print(fmt.string(from: startDate))
            startDate = calendar.date(byAdding: .day, value: 1, to: startDate)!
        }
    }

    static func dateFromString(_ dateString: String) -> Date {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd"

        return dateFormatter.date(from: dateString)!
    }
}

und ich nenne das so:

Dates.printDatesBetweenInterval(Dates.dateFromString("2017-01-02"), Dates.dateFromString("2017-01-9"))

Die Ausgabe ist:

2017-01-02
2017-01-03
2017-01-04
2017-01-05
2017-01-06
2017-01-07
2017-01-08
2017-01-09

Hier ist Lösung von Alle Daten zwischen zwei Datumsangaben drucken (Swift 4 Code)

var mydates : [String] = []
let startDate = "2018-03-01"
let endDate   = "2018-03-05"

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: startDate)!
dateTo = fmt.date(from: endDate)!


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

}

print(mydates) // Your Result

Ausgabe ist:

["2018-03-01", "2018-03-02", "2018-03-03", "2018-03-04", "2018-03-05"]
1
Nikunj Kumbhani

Ihr gewünschter Code wird wie

    let startDate = NSDateComponents()
    startDate.year = 2015
    startDate.month = 9
    startDate.day = 1
    let calendar = NSCalendar.currentCalendar()
    let startDateNSDate = calendar.dateFromComponents(startDate)!


    var offsetComponents:NSDateComponents = NSDateComponents();
    offsetComponents.day = 1
    var nd:NSDate = startDateNSDate;

    println(nd)
    while nd.timeIntervalSince1970 < NSDate().timeIntervalSince1970 {
        nd = calendar.dateByAddingComponents(offsetComponents, toDate: nd, options: nil)!;
            println(nd)


    }
1
M.Shuaib Imran