2015-09-12 30 views
10

tôi là tạo ra một ngày sử dụng NSDateComponents():Swift: In tất cả các ngày giữa hai NSDate()

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

... bây giờ tôi muốn in tất cả các ngày kể từ khi startDate đến ngày hôm nay, NSDate(). Tôi đã thử chơi với NSCalendarUnit, nhưng nó chỉ cho thấy sự khác biệt hoàn toàn, không phải ngày duy nhất giữa.

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

Làm cách nào để in tất cả các ngày giữa hai NSD?

Trả lời

39

Chỉ cần thêm một đơn vị ngày để cập nhật cho đến khi nó đạt đến ngày hiện tại (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: [])! 
} 

Cập nhật cho 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

giải pháp tuyệt vời, cảm ơn bạn! – ixany

+0

@Martin: tôi nhận được lỗi này "Toán tử nhị phân '<=' không thể áp dụng cho hai toán hạng 'NSDate'. Làm ơn giúp tôi. – Smita

+0

@Smita Bạn sử dụng phiên bản Xcode/Swift nào? –

1

đang mong muốn của bạn trở nên như

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

giải pháp tuyệt vời quá, làm việc như mong đợi. cảm ơn bạn! – ixany

1

Tôi đang sử dụng phương thức này 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)! 
    } 
} 

và tôi kêu gọi này như:

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

Đầu ra là:

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

Sử dụng phần mở rộng:

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

Cách sử dụng:

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

Cùng một điều nhưng đẹp:

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

Làm thế nào để có được tất cả các ngày trong 20 ngày tiếp theo:

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

'startDate' là gì? – amin

+1

@amin change Date() thành startDate của bạn – AlexanderZ

Các vấn đề liên quan