2014-11-07 12 views

Odpowiedz

58

Znajduję metodę wcześniejsząData.

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

Trzeba również laterDate

Switf3:

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

Dzięki, popatrzę na to. –

+0

to wydaje się raczej zwracać datę niż boolean – rigdonmr

+3

swift3 czyni to prostszym: wystarczy użyć operatora

8

można rozszerzyć NSDate zgodności z protokołami Equatable i Comparable. Są to protokoły porównawcze w Swift i umożliwiają znanym operatorom porównania (==, <,> itd.) Pracę z datami. Umieść następujące pliki w pliku o odpowiedniej nazwie, np. NSDate+Comparison.swift w projekcie:

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 
} 

Teraz możesz sprawdzić, czy jedna data jest przed kolejnym ze standardowych operatorów porównania.

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

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

Aby uzyskać więcej informacji na temat rozszerzeń w Swift, patrz: here. Aby uzyskać informacje na temat protokołów równoważnych i porównywalnych, zobacz odpowiednio: here i here.

Uwaga: W tym przypadku nie tworzymy niestandardowych operatorów, tylko rozszerzamy istniejący typ, aby obsługiwać istniejących operatorów.

8

Nie trzeba tutaj przedłużać NSDate, wystarczy użyć "porównania", jak pokazano w docs.

Na przykład w Swift:

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

Czy mógłbyś rozwinąć coś takiego jak ja, jak ustawić wcześniej zmienną myDate? Czy musi to być w określony sposób, czy jest to INT, czy nie? Naprawdę nie mogę się doczekać twojej opinii. –

+1

@MichelKapelle 'myDate' jest instancją' NSDate'. Sprawdź link, który nick dodał, a zobaczysz to w dokumentach: 'func compare (_ other: NSDate) -> NSComparisonResult', stąd:' other' jest 'myDate'. –

28

Istnieje prosty sposób aby to zrobić. (Swift 3 jest jeszcze bardziej proste, sprawdź w końcu odpowiedź)

Kod Swift:

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

Jeśli trzeba porównać datę bez czasu ("dd/mm/rrrr").

Kod Swift:

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

Jabłko Link docs here.

Edit 1: Ważne

Od Swift 3 migration notes:

migrator jest konserwatywny, ale istnieją pewne zastosowania NSDate, które mają lepsze reprezentacje w Swift 3:
(x as NSDate).earlierDate(y) mogą być zmieniane do x < y ? x : y
(x as NSDate).laterDate(y) można zmienić na x < y ? y : x

W Swift 3 można więc używać operatorów porównania.

-1

Wykonane szybkie Swift 2.3 funkcja z tego

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

Używaj go tak, aby sprawdzić, czy data jest przed dzisiejszą datą

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

Albo z datą zwyczaj odniesienia

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

Jeśli trzeba porównać jedną datę z teraz bez tworzenia nowego obiektu Date można po prostu użyć tego w Swift 3:

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

i

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

powinna to być zaakceptowana odpowiedź bardziej czytelna i ma więcej sensu – Ammad

Powiązane problemy