2014-11-07 30 views

risposta

58

Trovo il metodo precedente Date.

if date1.earlierDate(date2).isEqualToDate(date1) { 
    print("date1 is earlier than date2") 
} 

si ha anche la laterDate

Switf3:

if date1 < date2 { 
    print("date1 is earlier than date2") 
} 
+0

Grazie, darò un'occhiata a questo. –

+0

sembra restituire una data piuttosto che una booleana – rigdonmr

+3

swift3 lo rende più semplice: basta usare l'operatore < –

8

È possibile estendere NSDate a conformarsi ai protocolli Equatable e Comparable. Questi sono protocolli di confronto in Swift e consentono agli operatori di confronto familiari (==, <, ecc.) Di lavorare con le date. Metti quanto segue in un file con nome appropriato, ad es. NSDate+Comparison.swift nel progetto:

extension NSDate: Equatable {} 
extension NSDate: Comparable {} 

public func ==(lhs: NSDate, rhs: NSDate) -> Bool { 
    return lhs.timeIntervalSince1970 == rhs.timeIntervalSince1970 
} 

public func <(lhs: NSDate, rhs: NSDate) -> Bool { 
    return lhs.timeIntervalSince1970 < rhs.timeIntervalSince1970 
} 

Ora è possibile controllare se una data è prima di un altro con gli operatori di confronto standard.

let date1 = NSDate(timeIntervalSince1970: 30) 
let date2 = NSDate() 

if date1 < date2 { 
    print("ok") 
} 

Per informazioni sulle estensioni in Swift vedere here. Per informazioni sui protocolli Equitable e Comparable vedere here e here, rispettivamente.

Nota: In questa istanza non stiamo creando operatori personalizzati, ma semplicemente estendendo un tipo esistente per supportare gli operatori esistenti.

8

Non è necessario estendere NSDate qui, basta usare "confronta" come illustrato nello docs.

Per esempio, in Swift:

if currentDate.compare(myDate) == NSComparisonResult.OrderedDescending { 
    println("myDate is earlier than currentDate") 
} 
+0

E potresti elaborare un noob come me, come si imposta la variabile myDate prima di quello? Deve essere in un modo specifico, è un INT o no? Aspetto davvero il tuo feedback. –

+1

@MichelKapelle 'myDate' è un'istanza di' NSDate'. Controlla il link che ha aggiunto il nick, e lo vedrai nei documenti: 'func compare (_ other: NSDate) -> NSComparisonResult', quindi:' other' è 'myDate'. –

28

C'è un modo semplice per farlo. (Swift 3 è ancora più semplice, controllare alla fine della risposta)

Swift code:

if myDate.timeIntervalSinceNow.isSignMinus { 
    //myDate is earlier than Now (date and time) 
} else { 
    //myDate is equal or after than Now (date and time) 
} 

Se avete bisogno di confrontare data senza tempo ("MM/dd/yyyy").

Swift code:

//Ref date 
let dateFormatter = NSDateFormatter() 
dateFormatter.dateFormat = "MM/dd/yyyy" 
let someDate = dateFormatter.dateFromString("03/10/2015") 

//Get calendar 
let calendar = NSCalendar.currentCalendar() 

//Get just MM/dd/yyyy from current date 
let flags = NSCalendarUnit.CalendarUnitDay | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitYear 
let components = calendar.components(flags, fromDate: NSDate()) 

//Convert to NSDate 
let today = calendar.dateFromComponents(components) 

if someDate!.timeIntervalSinceDate(today!).isSignMinus { 
    //someDate is berofe than today 
} else { 
    //someDate is equal or after than today 
} 

di Apple collegamento docs here.

Edit 1: Importante

Da Swift 3 migration notes:

Il migratore è conservatore, ma ci sono alcuni usi di NSDate che hanno rappresentazioni migliori in Swift 3:
(x as NSDate).earlierDate(y) possono essere cambiate a x < y ? x : y
(x as NSDate).laterDate(y) può essere modificato in x < y ? y : x

Quindi, in Swift 3 è possibile utilizzare gli operatori di confronto.

-1

ha effettuato un veloce Swift 2.3 funzione di questo

// if you omit last parameter you comare with today 
// use "11/20/2016" for 20 nov 2016 
func dateIsBefore(customDate:String, referenceDate:String="today") -> Bool { 

    let dateFormatter = NSDateFormatter() 
    dateFormatter.dateFormat = "MM/dd/yyyy" 

    let myDate = dateFormatter.dateFromString(customDate) 
    let refDate = referenceDate == "today" 
     ? NSDate() 
     : dateFormatter.dateFromString(referenceDate) 

    if NSDate().compare(myDate!) == NSComparisonResult.OrderedDescending { 
     return false 
    } else { 
     return true 
    } 
} 

Usalo come questo per vedere se la data è prima della data odierna

if dateIsBefore("12/25/2016") { 
    print("Not Yet Christmas 2016 :(") 
} else { 
    print("Christmas Or Later!") 
} 

O con una data di riferimento personalizzato

if dateIsBefore("12/25/2016", referenceDate:"12/31/2016") { 
    print("Christmas comes before new years!") 
} else { 
    print("Something is really wrong with the world...") 
} 
6

Se è necessario confrontare un appuntamento con la società senza creazione di nuovo oggetto Date si può semplicemente utilizzare questo a Swift 3:

if (futureDate.timeIntervalSinceNow.sign == .plus) { 
    // date is in future 
} 

e

if (dateInPast.timeIntervalSinceNow.sign == .minus) { 
    // date is in past 
} 
+1

questa dovrebbe essere la risposta accettata più leggibile e ha più senso – Ammad

Problemi correlati