2015-09-30 9 views
11

Mam ten kod, gdzie przekonwertować ciąg do obiektu dataSprawdź, czy data przypada między 2 dat

let date2 = KeysData[indexPath.row]["starttime"] as? String 

let dateFormatter = NSDateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ" 

if let date = dateFormatter.dateFromString(date2!) { 
    println(date)   
} 

Chciałbym wiedzieć, czy bieżąca data przypada między 2 dni dostałem w tablicy startdate i endate

Odpowiedz

39

Masz już kod do konwersji ciągu dat w KeysData na NSDate. Zakładając, że masz dwie daty w startdate i enddate, wszystko co musisz zrobić, to sprawdzić, czy bieżąca data jest pomiędzy:

let startdate = ... 
let enddate = ... 

NSDate().isBetweeen(date: startdate, andDate: enddate) 

extension NSDate { 
    func isBetweeen(date date1: NSDate, andDate date2: NSDate) -> Bool { 
     return date1.compare(self) == self.compare(date2) 
    } 
} 

Edit: Jeśli chcesz wykonać integracyjnego czek zakresem, użyć ten warunek:

extension NSDate { 
    func isBetweeen(date date1: NSDate, andDate date2: NSDate) -> Bool { 
     return date1.compare(self).rawValue * self.compare(date2).rawValue >= 0 
    } 
} 
+0

To miłe „trick”, ale być może trzeba dodać, że sprawdza „ściśle pomiędzy”, czyli data rozpoczęcia i zakończenia nie są wliczone (które mogą lub nie mogą być poszukiwane). –

+0

@MartinR Dobry punkt. –

+0

@NikolaiRuhe hej, dziękuję za odpowiedź, ale czy rozwiązałeś notkę Martina R.? Zmierzyłem się również z tym samym problemem, data rozpoczęcia i data zakończenia to ta sama data, więc kiedy podążam za twoją odpowiedzią, ten dzwonek nie zwrócił prawdy – Rawan

53

Swift 3 czyni to o wiele łatwiejszym.

let fallsBetween = (startDate ... endDate).contains(Date()) 

Teraz NSDate jest mostkiem typu wartości Date i Date zgodny Comparable możemy po prostu tworzą ClosedRange<Date> i użyć metody contains aby sprawdzić, czy bieżąca data jest włączone.

Zastrzeżenie: endDate musi być większe lub równe startDate. W przeciwnym razie zakres nie mógłby zostać utworzony, a kod ulegnie awarii przy pomocy fatalError.

Jest bezpieczny:

extension Date { 
    func isBetween(_ date1: Date, and date2: Date) -> Bool { 
     return (min(date1, date2) ... max(date1, date2)).contains(self) 
    } 
} 
+1

Może warto edytować poprzednio przyjąłem odpowiedź z tym. To jest świetne! –

+0

Czy możesz dodać, jak uwzględnić datę początkową? z jakiegoś powodu nie wliczając daty początkowej – XcodeNOOB

+0

@XcodeNOOB: Działa dla mnie. Sekwencje Swift "ClosedRange" i "zawiera" oznaczają, że zarówno data początkowa, jak i końcowa są włączone: '(startDate ... endDate) .contains (startDate) == true' i' (startDate ... endDate) .contains (endDate) == true'. –

-1
extension Date { 

    func isBetweeen(date date1: Date, andDate date2: Date) -> Bool { 
     return date1.timeIntervalSince1970 < self.timeIntervalSince1970 && date2.timeIntervalSince1970 > self.timeIntervalSince1970 
    } 

} 
1
extension Date 
{ 
    func isBetween(startDate:Date, endDate:Date)->Bool 
    { 
     return (startDate.compare(self) == .orderedAscending) && (endDate.compare(self) == .orderedDescending) 
    } 
} 
Powiązane problemy