Les dates, cauchemar inavouable des développeuse(eurs)… Tu en rêves la nuit, tu ne sais pas comment faire pour gérer les différentes zones, les différents formats, … Bref, tu t’arraches les cheveux ! Mais tout ceci prend fin aujourd’hui. Car, ensemble, nous allons apprendre à gérer les dates en Swift !

Les bases

Il existe différentes façons de créer des dates en Swift et d’y appliquer un format spécial. Voyons tout ça ici.

Date()

Utilisons la classe Date() de Swift pour créer une date « classique ». Par défaut, elle affiche la date et l’heure actuelle.

var now = Date()

print(now) // Affiche la date sous forme yyyy-MM-dd hh:mm:ss +0000
print(now.formatted()) // Affiche M/dd/yyyy, hh:mm AM ou PM
print(now.description(with: Locale(identifier: "fr")))
// Affiche lundi 1 mai 2023 à 14:00:00 heure d’été d’Europe centrale

Légende :

  • y : année. Utiliser 4 -y pour l’année entière, 2 -y pour 2 chiffres
  • MMMM : nom du mois écrit
    • MM : mois en chiffres
    • MMM : mois en lettres mais abbrévié
    • MMM : mois écrit en entier
  • d : jour. Utiliser 2 -d pour 2 chiffres
  • EEEE : jour sous forme écrite
  • h : heure. Utiliser 2 -h pour un double chiffre
    • H : Utiliser la majuscule pour avoir les chiffres en format 24h
  • mm : minutes
  • s : secondes
  • zzzz : timeZone
  • AM / PM : Plage horaire anglaise (AM matin et PM soir)

☞ Plus d’infos sur les formats de date ou sur l‘interface graphique de NSDateFormatter pour créer ton propre format de date.

DateFormatter()

Il est possible de formater la date afin qu’elle apparaisse sous le bon format pour l’utilisateur.

On peut donc, soit créer une date « classique », puis y appliquer certaines fonctions, dont la fonction formatter(). Soit créer directement une date et la formater selon nos souhaits avec la classe native de Swift DateFormatter().

var now                     = Date()
var dateFormatter           = DateFormatter() // Création de la variable du formatage
dateFormatter.locale        = Locale(identifier: "fr_FR") // Résultat en Français
dateFormatter.dateFormat    = "dd MMMM yyyy 'à' HH:mm " // Création du format personnalisé
print(dateFormatter.string(from: now))
// Affiche lundi 1 mai 2023 à 14:00

⚠️ Il est important de renseigner la locale selon le pays d’affichage car une date anglaise n’aura pas le même format qu’une date américaine ou française : 01/05/23 ou 05/01/23 donne 1er Mai ou 05 Janvier ?

• Calendar

En Swift, la classe Calendar est utilisée pour travailler avec des calendriers. Cette classe fournit des méthodes pour manipuler des dates et des intervalles de temps en fonction des règles d’un calendrier spécifié. La plupart du temps, nous travaillons avec un calendrier Grégorien :

let gregorianCalendar = Calendar(identifier: .gregorian) // Calendrier grégorien

let calendar = Calendar.current
print("Le calendrier actuel est \(calendar)")
// Affiche "Le calendrier actuel est gregorian (current)"

La classe Calendar permet également de gérer les fuseaux hoaraires (timeZone) :

print("La timeZone actuelle est \(Calendar.current.timeZone)")
// Affiche "La timeZone actuelle est Europe/Paris (fixed (equal to current))"

Récupération des composants de date :

let date = Date()
let year = calendar.component(.year, from: date)
let month = calendar.component(.month, from: date)
let day = calendar.component(.day, from: date)
let hour = calendar.component(.hour, from: date)
let minute = calendar.component(.minute, from: date)

print("Date : \(day)/\(month)/\(year) - Heure : \(hour):\(minute)")
// Affiche "Date : 1/5/2023 - Heure : 16:00"

Calcul de différences entre deux dates :

let date1 = calendar.date(byAdding: .day, value: -7, to: Date())!
let date2 = Date()

let difference = calendar.dateComponents([.day, .hour, .minute], from: date1, to: date2)

print("La différence entre les deux dates est de : \(difference.day!) jours, 
\(difference.hour!) heures et \(difference.minute!) minutes.")
//Affiche "La différence entre les deux dates est de : 7 jours, 0 heures et 0 minutes."

On ajoute ici la valeur -7 à la première date.

C’est la méthode <a href="https://developer.apple.com/documentation/foundation/calendar/2293646-datecomponents/" target="_blank" rel="noreferrer noopener">dateComponents()</a> qui nous permet de calculer la différence entre les deux dates.

DateComponents

Avec DateComponents(), nous pouvons créer une date en personnalisant directement tous les attributs dont nous avons besoin. Cette classe fonctionne également avec le calendrier que nous avons vu précédemment.

let defiAppli = DateComponents(
    timeZone: TimeZone(identifier: "fr_FR"),
    year: 2023,
    month: 9,
    day: 4,
    hour: 20,
    minute: 00
)

let defiAppliDate = Calendar.current.date(from: defiAppli)! 
// On force la variable avec ! car on sait qu'elle ne sera pas nulle
// Sinon, le format affiché est Optional
// Affiche "Sep 4, 2023 at 8:00 PM"

let defiAppliDateFormatted = dateFormatter.string(from: defiAppliDate)
print(defiAppliDateFormatted)
// Affiche "lundi 04 septembre 2023 à 20:00"

Alternative à la création d’une variable DateComponents() :

var defiAppli = DateComponents()
defiAppli.timeZone = TimeZone(identifier: "fr_FR")
defiAppli.year = 2023
defiAppli.month = 9
defiAppli.day = 4
defiAppli.hour = 20
defiAppli.minute = 00

On utilise ici une variable car chacun de ses attributs peuvent être changés.

Résumé sur les dates en Swift

  1. Utilise la classe DateFormatter pour formater les dates selon un format spécifique. Elle permet de convertir une chaîne de caractères en objet Date et vice versa.
  2. Utilise la classe Calendar pour manipuler les dates en fonction des fuseaux horaires et des calendriers locaux. Cette classe permet de récupérer les composants de date, de calculer les différences entre deux dates et d’effectuer des opérations de calendrier telles que l’ajout ou la soustraction de jours, de mois ou d’années.
  3. Pour éviter les erreurs de conversion de date, utilise toujours des formats de date standardisés tels que ISO 8601 (par exemple, « yyyy-MM-dd’T’HH:mm:ssZ »).
  4. Pour manipuler des dates récurrentes, utilise la classe DateComponents pour définir des règles de récurrence et la classe RecurrenceRule pour appliquer ces règles aux dates.
  5. Pour travailler avec des dates qui nécessitent des calculs précis, utilise la classe DateComponentsFormatter pour calculer les durées et les écarts de temps entre deux dates avec une précision élevée.
  6. Si tu dois manipuler des dates à plusieurs endroits de ton code, n’hésites pas à les stocker dans des constantes ou des variables globales pour éviter les erreurs de saisie de dates différentes.


Voilà, tu en sais maintenant beaucoup sur les dates. J’espère que cet article t’auras été utile et que ça te donneras envie de les utiliser plus souvent !

Call to Action

Si tu as aimé cet article, partage le 🫶