Travailler avec les dates et l'heure en Swift : des bases aux techniques avancées
Travailler avec les dates et l'heure est l'une des tâches clés dans le développement d'applications pour iOS et macOS. Swift fournit un ensemble d'outils puissant et flexible à cet effet : Date, DateFormatter, Calendar, DateComponents et TimeInterval. Dans cet article, nous allons détailler chacun d'eux, montrer des exemples pratiques et apprendre à résoudre des tâches typiques telles que le formatage des dates, le calcul de la différence de temps, la gestion des fuseaux horaires et des calendriers.
1. Les bases : la classe Date et TimeInterval
Le type de base pour représenter un moment dans le temps est Date. Il stocke le nombre de secondes écoulées depuis le 1er janvier 2001 à 00:00:00 UTC (date de référence pour Apple).
Création et comparaison de dates :
import Foundation
// Date et heure actuelleslet now = Date()print("Maintenant : \\(now)")
// Date basée sur un intervalle de temps (120 secondes à partir du moment actuel)let futureDate = Date(timeIntervalSinceNow: 120)print("Dans 2 minutes : \\(futureDate)")
// Date basée sur un intervalle fixe depuis la date de référencelet specificDate = Date(timeIntervalSinceReferenceDate: 3600 * 24 * 365) // 1 an à partir de 2001print("Date approximative : \\(specificDate)")
// Comparaison de datesif now < futureDate { print("La date actuelle est antérieure à la date future")}TimeInterval est simplement un alias pour Double, représentant un nombre de secondes. Il est utilisé pour calculer la différence entre les dates :
let startDate = Date()sleep(2) // Simulation d'un délailet endDate = Date()
let elapsed: TimeInterval = endDate.timeIntervalSince(startDate)print("\\(elapsed) secondes se sont écoulées") // Affichera ~2.0
// Opération inverselet minutes: TimeInterval = 5 * 60let fiveMinutesLater = Date(timeInterval: minutes, since: startDate)2. Formatage des dates avec DateFormatter
Pour afficher une date à l'utilisateur de manière compréhensible, on utilise DateFormatter. Il prend en charge la localisation et de nombreux styles.
Formatage de base :
let formatter = DateFormatter()formatter.locale = Locale(identifier: "fr_FR") // Locale françaiseformatter.timeZone = TimeZone.current // Fuseau horaire actuel
// Styles standardformatter.dateStyle = .fullformatter.timeStyle = .shortprint(formatter.string(from: Date())) // Par exemple : "vendredi 24 février 2025 à 14:30"
formatter.dateStyle = .mediumformatter.timeStyle = .noneprint(formatter.string(from: Date())) // "24 févr. 2025"Format personnalisé :
formatter.dateFormat = "dd.MM.yyyy HH:mm"print(formatter.string(from: Date())) // "24.02.2025 14:30"
// Analyse d'une chaîne en datelet dateString = "25.12.2024 10:00"if let parsedDate = formatter.date(from: dateString) { print("Date analysée : \\(parsedDate)")}Important : Lors de l'analyse, vérifiez toujours que date(from:) ne retourne pas nil. Un format de chaîne incorrect ou une non-concordance de la locale entraînera une erreur.
3. Calculs calendaires : Calendar et DateComponents
La classe Calendar encapsule les informations sur le système calendaire (grégorien, islamique, bouddhiste, etc.) et permet d'effectuer des opérations complexes sur les dates. DateComponents est utilisé pour décrire les composants individuels d'une date (année, mois, jour, heure, etc.).
Extraction des composants :
let calendar = Calendar.currentlet components = calendar.dateComponents([.year, .month, .day, .weekday], from: Date())
print("Année : \\(components.year!)")print("Mois : \\(components.month!)")print("Jour : \\(components.day!)")print("Jour de la semaine : \\(components.weekday!)") // 1 - dimanche, 2 - lundi...