2016-06-11 16 views
0

Ich berechne den Tag Unterschied zwischen zwei Daten, aber ich fand heraus, dass der folgende Code tatsächlich gibt mir den Unterschied für 24 Stunden und nicht die Differenz im Datum. Ich habe den folgenden Code:Wie kann ich den Tag Unterschied in dem folgenden Beispiel herausfinden

func daysBetweenDate(startDate: NSDate, endDate: NSDate) -> Int 
{ 
    let calendar = NSCalendar.currentCalendar() 

    let components = calendar.components([.Day], fromDate:startDate, toDate: endDate, options: []) 

    return components.day 
} 

So, für das folgende Beispiel, das ich dieses Ergebnis:

lastLaunch: 2016-06-10 01:39:07 +0000

toady: 2016- 06-11 00:41:41 +0000

dayDiff: 0

ich würde den Tag Unterschied zu sein erwartet, seit dem letzten Start am 10. war und heute ist der 11.. Wie kann ich den Code ändern, um mir den tatsächlichen Unterschied für Tage zu geben?

+0

Wäre es 1, wenn die heutige Zeit 2016-06-11 01:39:07 +0000 oder später wäre? –

+0

Schauen Sie hier, da Ihre Frage sehr ähnlich zu sein scheint: http://stackoverflow.com/questions/4739483/number-of-days-between-two-nsdates – Ike10

Antwort

2

Sie können Kalender-Methode Datum BySettingHour verwenden, um die Mittagszeit für Ihre startdate und endDate zu bekommen, um Ihre Kalenderberechnungen nicht an der Zeit empfindlich zu machen:

Xcode 8.2.1 • Swift 3.0.2

extension Date { 
    var noon: Date? { 
     return Calendar.autoupdatingCurrent.date(bySettingHour: 12, minute: 0, second: 0, of: self) 
    } 
    func daysBetween(_ date: Date) -> Int? { 
     guard let noon = noon, let date = date.noon else { return nil } 
     return Calendar.autoupdatingCurrent.dateComponents([.day], from: noon, to: date).day 
    } 
} 

let startDateString = "2016-06-10 01:39:07 +0000" 
let todayString = "2016-06-11 00:41:41 +0000" 
let formatter = DateFormatter() 
formatter.calendar = Calendar(identifier: .iso8601) 
formatter.locale = Locale(identifier: "ex_US_POSIX") 
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss xxxx" 
if let startDate = formatter.date(from: startDateString), 
    let endDate = formatter.date(from: todayString), 
    let days = startDate.daysBetween(endDate) { 
    print(startDate) // "2016-06-10 01:39:07 +0000\n" 
    print(endDate) // "2016-06-11 00:41:41 +0000\n" 
    print(days ?? "nil") // 1 
} 

Swift 2.x

extension NSDate { 
    var noon: NSDate { 
     return NSCalendar.currentCalendar().dateBySettingHour(12, minute: 0, second: 0, ofDate: self, options: [])! 
    } 
} 
func daysBetweenDate(startDate: NSDate, endDate: NSDate) -> Int { 
    return NSCalendar.currentCalendar().components([.Day], 
           fromDate: startDate.noon, 
           toDate: endDate.noon, 
           options: []).day 
}