Transformation de date en swift 3

PatyomPatyom Membre
juillet 2017 modifié dans API AppKit #1

Bonjour,


Je voudrais changer la présentation d'une date, voilà  ce que j'ai : "03/11/2016" et je voudrais l' afficher comme çà  : "3 Novembre 2016"


 


Est-ce qu'il y a une instruction pour cela (DateFormatter)?


 


et est-ce possible ?


Réponses

  • LarmeLarme Membre
    juillet 2017 modifié #2

    Voici la logique :



    (NS)String <-- (NS)DateFormatter --> (NS)Date

    Pour transformer ton (NS)String ("03/11/2016"), utilise un (NS)DateFormatter avec le dateFormat correspondant afin d'avoir une (NS)Date.


    Ensuite, change le dateFormat pour avoir celui que tu veux (JourEnChiffres MoisEnToutesLettres AnnéeEnChiffres), puis transforme la (NS)Date précédente en (NS)String.


     


    Pour le dateFormat, il faut se référer à  la documentation.


     


    Dans ton cas, le premier dateFormat sera dd/MM/yyyy. Je te laisse volontairement deviner le suivant (avec peut-être un problème de locale pour avoir le mois en français, mais ça reste du détail). Si la date a une ou deux heures de différence, c'est sûrement la timeZone (regarde le +0000 ou autre), ne t'en occupes pas si à  quelques heures prêt, tu as la bonne date.

    Pourquoi je ne te donne pas directement la solution ? Car pour voir autant de problèmes sur StackOverflow concernant les dates (et 49% des cas concernent la compréhension du dateFormat et ne pas y mettre n'importe quoi en croisant les doigts, 49% autres concernent les timezones/fuseaux horaires, et les 2% restant sont un peu plus complexes et variés) , je te laisse essayer de comprendre comment fonctionne le dateFormat, car une fois que c'est maà®trisé, pratiquement plus aucune date ne te posera problème.


  • Il parait qu'iOS 23 gère les fuseaux horaires martien, à  la demande de Musk ..

  • PatyomPatyom Membre
    juillet 2017 modifié #4

    désolé Larme, je n'y arrive pas, j'y suis depuis ce matin.



    let dateString = "12/10/2017"
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "dd/MM/yyyy"

    let res = dateFormatter.date(from: dateString)

    j'ai fait çà  avec un PlayGround


    mais c'est ensuite que je ne suis plus dans le coup


     


    il me faut transformer "res" en format "dd EEEE yyyy" donc ?


  • Je comprends comment cela se passe à  partir de la "current Date"



    var date = Date()

    let dateFormatter = DateFormatter()

    dateFormatter.dateStyle = .full
    dateFormatter.timeStyle = .none

    dateFormatter.locale = Locale(identifier: "fr-FR")
    print (dateFormatter.string(from: date)) // "mercredi 12 juillet 2017\n"

    mais pas à  partir d'une saisie de date quelconque


  • Si cela t'embrouille de changer le dateFormat, tu peux créer un deuxième (NS)DateFormatter.


     


    res est un objet de type (NS)Date, non ?


    Bah, c'est bon alors, il suffit de faire comme avec la date courante.


     


    Sinon, pour en revenir à  ta question 


    il me faut transformer "res" en format "dd EEEE yyyy" donc ?

     Tu y étais presque.


    En relisant ma question juste au-dessus (res est un objet de type (NS)Date, non ?), il ne faut pas transformer res en format untel, il faut mettre ce dateFormat au (NS)DateFormatter et l'appeler pour transformer la (NS)Date en (NS)String


  • Il y a les styles pour les dates (comme pour les nombres, les unités, les distances etc.) qui permettent d'obtenir une date dans plusieurs styles différents. Ils devraient être privilégier avant d'utiliser dateFormat.


  • Cool Larme,


     


    ça marche :



    let dateString = "171013" // mon format de date en fichier (YYMMDD)
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale.init(identifier: "fr_Fr")
    dateFormatter.dateFormat = "yyMMdd"
    var res = dateFormatter.date(from: dateString)

    //
    let dtformatter = DateFormatter()
    dtformatter.dateFormat = "EEEE dd MMMM yyyy"
    let dateDef = dtformatter.string(from: res!)
    print (dateDef)
    > Affiche "vendredi 13 novembre 2017"

    Merci, je continue 

  • Bonsoir,


     


    Je cherche a afficher la date au format "EEEE dd MMMM yyyy HH: MM" et en Français dans Label ?



    import UIKit

    class ViewController: UIViewController {


    @IBOutlet weak var LabelTime: UILabel!

    var CurrentDate = Date()
    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    let french = DateFormatter()
    french.dateStyle = .medium
    french.timeStyle = .medium
    french.locale = Locale(identifier: "FR-fr")

    print(french.string(from:CurrentDate))


    let formatter = DateFormatter()


    formatter.dateFormat = " EEEE dd MMMM yyyy HH: MM"
    LabelTime.text = formatter.string(from: CurrentDate as Date)


    }




    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
    }


    }
     

  • Joanna CarterJoanna Carter Membre, Modérateur

    Il faut lire les docs sure DateFormatter :



    class ViewController: UIViewController
    {
    var disposable: Any?

    @IBOutlet weak var labelTime: UILabel!

    override func viewDidLoad()
    {
    super.viewDidLoad()

    let formatter = DateFormatter()

    formatter.locale = Locale(identifier: "FR-fr")

    formatter.dateFormat = "EEEE dd MMMM yyyy HH:mm"

    labelTime.text = formatter.string(from: Date())
    }
    }
  • En revanche je profite du sujet pour poser une question :


    Comment fait-on si l'application est publiée également dans d'autres pays que la France pour que la date soit dans la langue de l'iPhone ?


    à  la place de : 



    formatter.locale = Locale(identifier: "FR-fr")

    que faut-il écrire ?


    Merci.


  • Joanna CarterJoanna Carter Membre, Modérateur
    formatter.locale = Locale.autoupdatingCurrent
Connectez-vous ou Inscrivez-vous pour répondre.