2015-09-12 9 views
10

Ich bin ein Datum NSDateComponents() mit der Erstellung:Swift: Drucken Sie alle Termine zwischen zwei NSDate()

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

... jetzt habe ich alle Daten seit dem startDate bis heute ausdrucken möchten, NSDate(). Ich habe bereits versucht, mit NSCalendarUnit zu spielen, aber es zeigt nur den vollständigen Unterschied, nicht einzelne Daten dazwischen.

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 NSDates drucken?

Antwort

39

Nur einen Tag Einheit mit dem Datum hinzu, bis es das aktuelle Datum (Swift-2-Code) erreicht:

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)! 
} 
+0

großartige Lösung, danke! – ixany

+0

@Martin: Ich bekomme diesen Fehler "Binär-Operator '<=' kann nicht auf zwei" NSDate 'Operanden "angewendet werden. Bitte hilf mir. – Smita

+0

@Smita Welche Xcode/Swift-Version verwenden Sie? –

1

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) 


    } 
+0

große Lösung zu, arbeitete wie erwartet. Danke! – ixany

1

ich bin mit diesem Approac h (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 rufe dies wie:

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

Die Ausgabe lautet:

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

Einsatz von Verlängerungs:

extension Date{ 

func generateDatesArrayBetweenTwoDates(startDate: Date , endDate:Date) ->[Date] 
{ 
    var datesArray: [Date] = [Date]() 
    var startDate = startDate 
    let calendar = Calendar.current 

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

    while startDate <= endDate { 
     datesArray.append(startDate) 
     startDate = calendar.date(byAdding: .day, value: 1, to: startDate)! 

    } 
    return datesArray 
} 
} 

Verbrauch:

let datesBetweenArray = Date().generateDatesArrayBetweenTwoDates(startDate: Your Start Date Object , endDate: Your End Date Object) 
0

Gleiche, aber schönere:

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

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

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

Was ist 'Startdatum'? – amin

+1

@amin Ändern Sie Date() zu Ihrem Startdatum – AlexanderZ