2016-12-03 68 views
2

我通過Stackoverflow進行了大量搜索,但是我還沒有找到針對我的問題的答案。過濾所有事件的數組,並查找哪些事件正在進行

我正在開發一個應用程序,併爲某些事件獲取JSON數據。我得到的是事件的開始時間和事件的持續時間。所有數據都以String形式接收。

在應用程序的一個屏幕中,我只想顯示當前正在進行的事件。

例如:

Class Event { 

var startTime: String? 
var duration: String? 

} 

let event1 = Event() 
event1.starTime = "12-12-2016, 10:50 AM" 
event1.duration = "50min" 

let event2 = Event() 
event2.starTime = "12-12-2016, 09:50 AM" 
event2.duration = "40min" 

let event3 = Event() 
event3.starTime = "12-12-2016, 10:10 AM" 
event3.duration = "90min" 

let allEvents = [event1, event2, event3] 

,讓說,當前日期和時間是二○一六年十二月十二日,11:00 AM。如果我們將它們與當前日期進行比較,如何過濾/查找所有仍在進行的事件?

預先感謝您。

編輯:我的溶液

  1. 我創建方法dateString和durationString轉換爲開始日期:日期和結束日期:日期

    static func convertDateStringAndDurationStringToStartAndEndDate(date: String, duration: String) -> (start: Date, end: Date)? { 
    
        let dateFormatter = DateFormatter() 
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" 
        guard let startDate = dateFormatter.date(from: date) else { return nil } 
        guard let duration = Int(duration) else { return nil } 
    
        // recived interval is in minutes, time interval must be calculated in seconds 
        let timeInterval = TimeInterval(Int(duration) * 60) 
    
        let endDate = Date(timeInterval: timeInterval, since: startDate) 
    
        return (startDate, endDate) 
    
    } 
    
  2. 對於我已經創建分離方法過濾。在我的情況下,我正在使用Realm數據庫,但您會明白這一點。

    static func filterResultsForNowPlaying(results: Results<Show>?) -> Results<Show>? { 
    
        let currentDate = NSDate() 
    
        let datePredicate = NSPredicate(format: "startDate <= %@ AND %@ <= endDate", currentDate, currentDate) 
    
        let filteredShows = results?.filter(datePredicate) 
    
        return filteredShows 
    
    } 
    
+2

爲什麼你不的保存日期'Date'? –

+0

我知道如何將「startTime」保存爲Date對象,但我不知道如何在我的情況下使用持續時間。 – Excalibur

+0

如果你的'duration'字段總是有「* min」格式,那麼你可以刪除「min」插入並轉換爲int –

回答

2

你需要將其轉換爲日期,使用DateFormatter,然後用.filter陣列上方,並有與之相匹配的,如果當前日期是在範圍內。

如果你有改變的Event類的能力,可以大大簡化你的代碼,如果你與DateInterval類,它做同樣的事情更換您的事件類:

let minutes = 60; 
    let formatter = DateFormatter() 
    formatter.dateFormat = "MM-dd-yyyy" 

    let event1 = DateInterval(
     start: formatter.date(from: "12-12-2016")!, 
     duration: TimeInterval(20 * minutes) 
    ) 

    let now = Date() 
    if (event1.contains(now)) { 
     print("Event 1 is still active") 
    } 
+0

你能幫我一下如何從startTime和duration創建結束日期嗎?我對Swift中的Date對象非常陌生,而且我有點失落。 – Excalibur

+0

這取決於確切的格式。如果他們總是以「min」結尾,那麼你可以砍掉最後3個字符,轉換爲數字,然後使用DateInterval和TimeInterval完成剩下的工作。很難將其置於評論中。 –

+0

可以說我有startTime作爲日期對象和持續時間作爲Int。在那種情況下你會怎麼做? – Excalibur

相關問題