2017-09-17 18 views
0

現在、リーグを運営するサードパーティのウェブサイトからスポーツアプリのフィクスチャリストをダウンロードしているため、作業するデータが制限されています。Swiftの次の利用可能日付の日付書式

次回のフィクスチャを表示する機能を実装しようとしています。 検索する日付が次のようになります:

「土曜日9月17日」および「土曜日24日」など。

私は知っているDateFormatterに多数の日付形式を試しましたが、この特定の形式を使用するものは何も見つかりませんでした。

上記の文字列のいずれかを使用して日付フォーマッタの日付文字列メソッドを使用しようとすると、nil値が返されます。

私はそれぞれ独自の日付を持つ器具の配列を持っています。次の行がどれかを把握するために、これらのそれぞれを現在の日付と比較する必要があります。

一時的に修正したのは、フィクスチャをループするだけで、次のフィクスチャとして表示すると結果が表示されなくなったときでした。明らかに、ゲームが何らかの理由で再生されなかった場合、これは機能しません。

これに対処するにはどうすればよいでしょうか?

+2

あなたが試したことと遭遇した問題を示してください。 –

+1

NSDataDetectorを使用できます。 https://stackoverflow.com/questions/32595651/convert-string-with-unknown-format-any-format-to-date/32595941#32595941 –

+0

NSDataDetectorを使用しない場合は、3つの異なるあなたの日付文字列を解析しようとしているときのdateFormat(st、nd、th) "EEE dst 'MMM yy"、 "EEE dd" MMM yy "または" EEE d th' MMM yy " –

答えて

0

基本的にはあなたがちょうどあなたがあなたの第三者のウェブサイト(またはその逆)から取得した日付と同じ形式に現在の日付を変換する必要がありますので、あなたは簡単にそれらを比較することができます

let currentDate = Date() 

    let dateFormatter = DateFormatter() 

    dateFormatter.dateFormat = "EE MMM" 
    let firstPartStringDate = dateFormatter.string(from: currentDate) 

    dateFormatter.dateFormat = "yy" 
    let lastPartStringDate = dateFormatter.string(from: currentDate) 

    let day = Calendar.current.component(.day, from: currentDate) 

    let formatter = NumberFormatter() 
    formatter.numberStyle = .ordinal 

    guard let ordinalDay = formatter.string(for: day) else { 
     return 
    } 

    let finalDateString = firstPartStringDate + " \(ordinalDay) " + lastPartStringDate 

    print(finalDateString) 

、今日のために

Sun Sep 17th 17 

UPDATE:ここはあなたが第三-PAから入手Stringを変換することができる方法である現在の日付は、あなたは、サードパーティのWebサイトから入手1とまったく同じ形式になるだろうrtyウェブサイトをDateに変更し、それを現在の日付と比較してください。これは最初にStringの中にst、nd、rd、thを持つ問題を解決します。

// This is the string you get from the website  

    var webDateString = "Sat 9th Sep 17" 

// First, remove the st, nd, rd or th if it exists : 

    if let stSubrange = webDateString.range(of:"st") { 
     webDateString.removeSubrange(stSubrange) 
    } else if let ndSubrange = webDateString.range(of:"nd") { 
     webDateString.removeSubrange(ndSubrange) 
    } else if let rdSubrange = webDateString.range(of:"rd") { 
     webDateString.removeSubrange(rdSubrange) 
    } else if let thSubrange = webDateString.range(of:"th") { 
     webDateString.removeSubrange(thSubrange) 
    } 

// Now convert the string to a date : 

    dateFormatter.dateFormat = "EE MMM dd yy" 
    guard let formattedDate = dateFormatter.date(from: finalDateString) else { 
     return 
    } 

// You can now compare formattedDate and the current date easily like so : 

    let currentDate = Date() 

    if formattedDate < currentDate { 

     // Do something interesting here :) 

    } else { 

     // Do something else! 
    } 
+1

新しいNSNumberオブジェクトを作成する必要はありません。文字列(from :)からformatter.string(for:day)の代わりにstring(for :)を使用できます。 Btw OPは文字列ではない日付を取得したい –

+0

これは余分なステップになります。なぜなら、この日を文字列ではなく値として持つ必要があるからです。文字列への変換は、NumberFormatter 。 – Alex

+0

本当に申し訳ありませんが、これを指摘していただきありがとうございます。私は答えを更新し、 – Alex