Date et swifui dans nos applications

Bonjour,
Quelqu’un sais comment on fait pour les dates récupérées par internet en format json ? J’ai mis string et ça marche , mais je sais pas comment les mettre en format correcte et surtout je pense qu’elle ne son pas vu comme des dates mais une string ??

Bonjour,

Ce n’est pas genant de les garder au format string, car il faudra forcement le faire pour l’affichage. Tu peux changer le format si tu veux.

voila une fonction

func formatDatePost(dateToChange: String)-> String {

 let formatter = DateFormatter()
 formatter.locale = Locale(identifier: "FR-fr")
 // format comme tu le souhaites ici
 formatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss" 

 datePost = formatter.date(from: dateToChange)

  return formatter.string(from: datePost)

}

Merci je vais tester …


Comment je me sert de la fonction et je la met ou ?

Il manque l’initialisation au debut la ligne. Il faut rajouter « let »

let datePost = formatter.date(from: dateToChange)

Ce genre de fonction que je suis suceptible d’utiliser à plusiuers endroits dans mon code je les mets dans dans un fichier que j’appelle Functions.

Quand tu as besoin de l’appeler tu fais formatDatePost(dateToChange: « TA DATE ») à l’endroit où tu veux la mettre.
Par exemple dans un champ texte en swiftUI:

Text( formatDatePost(dateToChange: « TA DATE »))

ok merci beaucoup je vais tester ca tout de suite

HStack {
                                   // Text("\(item.id) ")
                                     //   .font(.footnote)
                                 //   Spacer()
                                    Text("Date:")
                                    Text(item.date)
                                    Text(formatDatePost(dateToChange: "\(item.date)"))
                                    /

ca me donne une erreur fatal a l’exécution

Text(formatDatePost(dateToChange: item.date))

je n’arrive pas a changer comme je veux ?

Salut Eric,
Dans mon dernier projet (sous IUKIT) j’ai eu à gérer des dates dans ma BDD et les ensuite les afficher. J’ai rajouté des fonctions dans un extension de la class String pour les convertir au format que je souhaitais. Je stocke en String en les convertissant au format ISO8601 (pour les trier plus facilement lors de la réponse de l’API) et les affiche au format que je souhaitais ( « Mercredi 23 février 2022 à 15h00 »).
Voici les détails de mes fonctions si ça peut te servir :

extension Date {
    /// Transforms the date to the desired display format -> String
    func dateToString() -> String {
        let strDate = self.dateToStrDay()
        let strHour = self.dateToStrHour()
        return "\(strDate) à \(strHour)"
    }
    
    /// Convert the time to the desired format HH:mm -> String
    func dateToStrHour() -> String {
        let hourFormatter = DateFormatter()
        hourFormatter.locale = Locale(identifier: "fr_FR")
        hourFormatter.dateStyle = DateFormatter.Style.none
        hourFormatter.timeStyle = DateFormatter.Style.short
        hourFormatter.dateFormat = "HH:mm"
        let strHour = hourFormatter.string(from: self)
        return strHour
    }
    
    /// convert the date to the desired format -> String
    func dateToStrDay() -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.locale = Locale(identifier: "fr_FR")
        dateFormatter.dateStyle = DateFormatter.Style.full
        dateFormatter.timeStyle = DateFormatter.Style.none
        let strDate = dateFormatter.string(from: self)
        return strDate
    }
}

extension String {
    /// Transforms String to the desired date format -> Date
    func strToDate() -> Date {
        let returnedDate: Date
        let dateFormatter = ISO8601DateFormatter()
        if let date = dateFormatter.date(from: self) {
            returnedDate = date
        } else {
            returnedDate = Date()
        }
        return returnedDate
    }

    /// Transforms String to the date format for DB -> Date
    func strDateForDisplay() -> String {
        let returnedStrDate : String
        let formatter = ISO8601DateFormatter()
        if let IsoDate = formatter.date(from: self) {
            returnedStrDate = IsoDate.dateToString()
        } else {
            returnedStrDate = self
        }
        return returnedStrDate
    }
}

// pour affichage depuis un String
let strDate = maDateEnString.strDateForDisplay()

// utilisation comme date (dans mon picker par exemple)
let date = maDateEnString.strToDate()

// pour affichage depuis le format Date
let date = maDateFromatDate.dateToString()

Cette page te permet de voir les formats disponibles : ios - Date Format in Swift - Stack Overflow

En espérant que ça puisse t’aider

Bon courage

Arnaud

merci je vais essayer, toujours pas réussi a faire se que je voulais avec ses dates

Salut, que veux-tu faires précisément ?

Directus me renvoie la date en string :

2022-03-20T13:00:00

Impossible de reconvertir en date ou en string formatée ?

Si si le DateFormatter a été créé pour !

let date = Date()
let formate = date.getFormattedDate(format: "yyyy-MM-dd HH:mm:ss") // Set output formate

extension Date {
   func getFormattedDate(format: String) -> String {
        let dateformat = DateFormatter()
        dateformat.dateFormat = format
        return dateformat.string(from: self)
    }
}

Tu peux éditer le format de :

"yyyy-MM-dd HH:mm:ss"

Ok voilà pour être plus clair. Je vous met un playground screen j’ai une date en format string , variable str , comment la passer en vrai date , la formater en un format date normale Francais ?
J’ai essayer avec tout se que vous m’avez indiquer sans succès . Alors monter moi à base de ma variable str comment faire ?

Salut @EricS,

Qu’est-ce que pour toi, une date française normale ?

Car samedi 26 février 2022 à 09:54 est une date française valide.

Bonjour,

Ceci ?

import SwiftUI

let str = "2022-03-20T 13:00:00"

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"

let dateFromString = dateFormatter.date(from: str)

print("\(String(describing: dateFromString))")

Cordialement,
Nicolas


Merci … ca ma bien aider j’ai résolu mon problème enfin.

Voilà ma fonction final de formatage