2017-09-17 3 views
0

Je suis en train de télécharger des listes d'appareils pour une application de sport à partir d'un site Web tiers qui gère la ligue, donc les données avec lesquelles je dois travailler sont limitées. J'essaie d'implémenter une fonctionnalité qui affiche le prochain projecteur à venir. Mon problème est que les dates récupérées ressemblent à ceci:Mise en forme de la date pour la prochaine date disponible dans Swift

"Sam 9 Sep 17" et "Sam 24 Mar 18" par exemple.

J'ai essayé de nombreux formats de date dans DateFormatter que je connais et je ne trouve rien qui utilise ce format spécifique.

Si j'essaie d'utiliser la méthode Date from string dans le formateur de date avec l'une des chaînes ci-dessus, j'obtiens une valeur nulle.

J'ai un tableau d'appareils, chacun avec leurs propres dates. J'ai besoin de comparer chacun d'entre eux à la date actuelle pour savoir quelle est la prochaine ligne. Mon correctif temporaire pour cela était simplement de faire une boucle sur les appareils et dès que l'on n'avait pas de résultat pour l'afficher comme appareil suivant. Évidemment, cela ne fonctionne pas quand un jeu n'a peut-être pas été joué pour une raison quelconque.

Quelle serait la meilleure façon de gérer cela?

+2

Montrez ce que vous avez essayé et les problèmes que vous avez rencontrés. –

+1

Vous pouvez utiliser NSDataDetector. https://stackoverflow.com/questions/32595651/convert-string-with-unknown-format-any-format-to-date/32595941#32595941 –

+0

Si vous ne voulez pas utiliser NSDataDetector, vous devez utiliser 3 différents dateFormat (st, nd et th) lorsque vous tentez d'analyser votre chaîne de date "EEE d'origine 'MMM yy", "EEE d'nd' MMM yy" ou "EEE d''MMM yy" –

Répondre

0

Fondamentalement, vous aurait juste besoin de convertir la date actuelle au même format que la date que vous obtenez de votre site Web tiers (ou le contraire) afin que vous puissiez les comparer facilement:

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) 

Et pour aujourd'hui date actuelle vous obtiendrez le format exactement le même que celui que vous obtenez à partir du site tiers:

Sun Sep 17th 17 

MISE À jOUR: Voici comment vous pouvez convertir le String que vous obtenez de la troisième-pa Rty site Web à un Date, puis le comparer avec la date actuelle. Ceci résout le problème d'avoir le st, le nd, le rd et le th à l'intérieur du String au début.

// 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

Pas besoin de créer un nouvel objet NSNumber, vous pouvez utiliser la chaîne (pour :) au lieu de la chaîne (à partir de :) 'formatter.string (pour: day)'. Btw l'OP veut obtenir une date pas une chaîne –

+0

Ce serait juste une étape supplémentaire car nous avons besoin d'avoir le jour comme valeur ici et pas une chaîne, la conversion en chaîne est faite juste après l'ajout du suffixe via NumberFormatter . – Alex

+0

Oh désolé, en effet, merci de le signaler. Je vais mettre à jour la réponse alors, – Alex