2015-09-12 30 views
10

Tworzę datę używając NSDateComponents():Swift: Drukowanie wszystkich dat pomiędzy dwoma NSDate()

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

... teraz chcę wydrukować wszystkie daty od startDate do dziś NSDate(). Próbowałem już grać z NSCalendarUnit, ale pokazuje tylko całkowitą różnicę, a nie pojedyncze daty pomiędzy.

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

Jak mogę wydrukować wszystkie daty między dwoma NSDates?

Odpowiedz

39

Wystarczy dodać jedną jednostkę dzień do dnia, aż osiągnie aktualną datę (Swift code 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: [])! 
} 

Aktualizacja 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

świetne rozwiązanie, dziękuję! – ixany

+0

@Martin: Otrzymuję ten błąd "Operator binarny" <= "nie może być zastosowany do dwóch argumentów" NSDate ". Proszę pomóż mi. – Smita

+0

@Smita Którą wersję Xcode/Swift używasz? –

1

pożądany kod staje się jak

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

doskonałym rozwiązaniem zbyt pracował zgodnie z oczekiwaniami. Dziękuję Ci! – ixany

1

Używam tego podejścia 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)! 
    } 
} 

i wzywam to tak:

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

Wyjście jest:

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

Korzystanie z rozszerzeniem:

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

Zastosowanie:

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

samo, ale ładniejsza:

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

Jak zdobyć wszystkie daty na najbliższe 20 dni:

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

co to jest "startDate"? – amin

+1

@amin zmienić datę() na twój startDate – AlexanderZ