2016-12-03 3 views
2

私はStackoverflowで多くの検索を行いましたが、私の問題の答えは見つかりませんでした。すべてのイベントのフィルタ配列とどのイベントがまだ進行中であるかを確認

私はアプリを開発しており、いくつかのイベントでJSONデータを取得しています。私が得るのは、イベントの開始時間とイベントの継続時間です。すべてのデータはStringとして記録されます。

アプリの1つの画面で、現在進行中のイベントのみを表示したいと考えています。例えば

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、現在の日付と時刻が2016年12月12日であるとしましょう。私たちが現在の日付と比較すると、それでも起こっているすべてのイベントのフィルタリング/検索はできますか?

ありがとうございます。

EDIT:私のソリューション

  1. 私はたstartDateに日付ストリングとdurationStringを変換するための方法を作成しました:日付とendDateには:日、私は分離法を作成したフィルタリングのために

    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

あなたがののように日付を保存ドンなぜ:あなたはEventクラスを変更する機能を持っている場合は、同じことを行いDateIntervalクラス、とあなたのEventクラスを置き換える場合

、あなたは大幅にコードを簡素化することができます「日付」? –

+0

"startTime"をDateオブジェクトとして保存する方法は知っていますが、私の場合はdurationを使用する方法がわかりません。 – Excalibur

+0

あなたの 'duration'フィールドには常に「* min」形式がありますが、「min」挿入を削除してintに変換することができます –

答えて

2

あなたはたDateFormatterを使用して、日付に変換する必要があり、その後、アレイの上.filterを使用して、現在の日付が範囲内であれば、それは上の一致しています。

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

私はDateオブジェクトとしてのstartTimeとIntとしての持続時間があると言うことができます。あなたはその場合どのようにしますか? – Excalibur

関連する問題