Vorrei verificare se un NSDate è prima (in passato) confrontandolo con la data corrente. Come lo farei?Verificare se la data è precedente alla data corrente (Swift)
Grazie
Vorrei verificare se un NSDate è prima (in passato) confrontandolo con la data corrente. Come lo farei?Verificare se la data è precedente alla data corrente (Swift)
Grazie
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")
}
Grazie, darò un'occhiata a questo. –
sembra restituire una data piuttosto che una booleana – rigdonmr
swift3 lo rende più semplice: basta usare l'operatore < –
È 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.
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")
}
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. –
@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'. –
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 ax < y ? x : y
(x as NSDate).laterDate(y)
può essere modificato inx < y ? y : x
Quindi, in Swift 3 è possibile utilizzare gli operatori di confronto.
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...")
}
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
}
questa dovrebbe essere la risposta accettata più leggibile e ha più senso – Ammad
Mostra i tentativi che hai già fatto per risolvere il problema. –