2015-11-04 3 views
0

У меня есть на структуру, такие как:Как фильтровать массив Struct по дате?

struct AdData { 
    var AdRequest = Int?() 
    var Date = NSDate?() // eg: 2015-11-01 04:00:00 +0000 
} 

И массив AdData:

var RawDataFromDb = [AdData]() 

Я хочу, чтобы найти все предметы в RawDataFromDb где Date матчей сегодняшнего дня. Я решил, что мне нужно как-то удалить компонент времени компонента Date, чтобы сравнить только дату, но я изо всех сил стараюсь найти элегантное решение.

До сих пор я пытался это без успеха:

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

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

extension NSDate: Comparable { } 


let TodayDate = NSDate() 
let TodayRows = RawDataFromDb.filter{($0.Date == TodayDate} 

Спасибо за вашу помощь!

+0

Объяснить, что вы думаете «, где дата соответствует текущей даты " означает. Вы имеете в виду, что его день, независимо от времени, должен быть таким же, как сегодня, независимо от времени? – matt

+0

Да, это именно так! К сожалению, я был не очень ясен – anto0522

+1

Я уверен, что вы найдете решение в ответах на упомянутый поток, например. используя 'isDateInToday' из этого ответа: http://stackoverflow.com/a/25538987/1187415. В противном случае дайте мне знать, и я снова открою вопрос. –

ответ

1

Основываясь на комментарии Мартина R и link, вы можете использовать isDateInToday! Что очень просто

Вы могли бы попробовать что-то вроде этого:

let gregorianCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! 

let TodayRows = RawDataFromDb.filter{ 
    return self.gregorianCalendar.isDateInToday($0.Date) 
} 

Что касается равных сравнимой я хотел бы использовать:

extension NSDate: Comparable { } 

public func ==(leftDate: NSDate, rightDate: NSDate) -> Bool { 
    return leftDate.isEqualToDate(rightDate) 
} 

Если вы используете это, вместо того, чтобы isDateInToday вам потребуется установить Today и часы struct.Date в 12 (чтобы сравнить даты, которые приземляются в первый день сбережения дневного света) и минуты/секунды до нуля. Поскольку часы, минуты и секунды влияют на сравнение.

Так, например:

let gregorianCalendar: NSCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! 
let today: NSDate = gregorianCalendar.dateBySettingHour(12, minute: 0, second: 0, ofDate: NSDate(), options: NSCalendarOptions())! 

let TodayRows = RawDataFromDb.filter{ 
    let structDate = self.gregorianCalendar.dateBySettingHour(12, minute: 0, second: 0, ofDate: NSDate(), options: NSCalendarOptions())! 
    return structDate == self.today 
} 
+2

Вы должны использовать 12pm вместо 12am для такого типа сравнения, так как не каждый день начинается в 12:00 –

+0

Не могли бы вы объяснить далее? :) Благодаря! – boidkan

+0

Летнее время –

1

Наиболее просто, всего за сегодня:

let calendar = NSCalendar.autoupdatingCurrentCalendar() 

let targetData = rawData.filter({ 
    $0.date != nil && calendar.isDateInToday($0.date!) 
}) 

Для произвольного дня:

let calendar = NSCalendar.autoupdatingCurrentCalendar() 

let targetDate = NSDate(timeIntervalSince1970: 123456789) 

let targetData = rawData.filter({ 
    $0.date != nil && calendar.isDate($0.date!, inSameDayAsDate: targetDate) 
}) 

 Смежные вопросы

  • Нет связанных вопросов^_^