Chciałbym sprawdzić, czy NSDate jest przed (w przeszłości), porównując go do bieżącej daty. Jak to zrobić?Sprawdź, czy data jest przed bieżącą datą (Swift)
Dzięki
Chciałbym sprawdzić, czy NSDate jest przed (w przeszłości), porównując go do bieżącej daty. Jak to zrobić?Sprawdź, czy data jest przed bieżącą datą (Swift)
Dzięki
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")
}
Dzięki, popatrzę na to. –
to wydaje się raczej zwracać datę niż boolean – rigdonmr
swift3 czyni to prostszym: wystarczy użyć operatora
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.
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")
}
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. –
@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'. –
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 dox < y ? x : y
(x as NSDate).laterDate(y)
można zmienić nax < y ? y : x
W Swift 3 można więc używać operatorów porównania.
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...")
}
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
}
powinna to być zaakceptowana odpowiedź bardziej czytelna i ma więcej sensu – Ammad
Pokaż próby, które już zostały podjęte w celu rozwiązania problemu. –