Introduction : pourquoi votre code avec les dates fonctionne "une fois sur deux" ?
\n\nImaginez : vous développez une application de calendrier ou de rappels. Il suffit de prendre la date actuelle et d'y ajouter un jour. Que pourrait-il mal se passer, semble-t-il ? Vous ouvrez Stack Overflow, trouvez une question avec des milliers de vues "How do I add 1 day to an NSDate ?" — et vous réalisez que même une opération aussi simple peut se transformer en cauchemar.
\n\nDans cet article, nous allons passer en revue les erreurs les plus courantes lors de l'ajout d'un jour à NSDate en Swift, apprendre à les éviter et écrire un code correct et fiable. Vous découvrirez pourquoi l'ancienne approche avec NSDate et timeInterval est une source de bugs, et comment les API modernes d'Apple sauvent la situation.
C'est parti pour comprendre les dates une fois pour toutes !
\n\nErreur n°1 : Utiliser timeInterval pour ajouter un jour
\n\nLe code catastrophe
\nL'erreur la plus fréquente que commettent les débutants :
\n\nlet today = NSDate()\nlet oneDay: TimeInterval = 24 * 60 * 60 // 86 400 secondes\nlet tomorrow = today.addingTimeInterval(oneDay)\n\nÀ première vue, c'est logique. Un jour a 24 heures, une heure a 60 minutes, une minute a 60 secondes. On multiplie, on ajoute — et voilà !
\n\nMais non. Cela ne fonctionne que dans 99% des cas, et dans 1% des cas, cela casse toute l'application pour les utilisateurs. Pourquoi ?
\n\nLes pièges cachés
\n- \n
- Le passage à l'heure d'été/hiver. Le jour du changement d'heure, une journée peut durer 23 ou 25 heures. Vos 86 400 secondes deviendront 83 400 ou 90 000. \n
- Les secondes intercalaires. Bien que rares, elles existent officiellement. \n
- Les fuseaux horaires. Si l'utilisateur voyage, son heure locale peut être perturbée. \n
- La précision à la seconde. Vous n'ajoutez pas simplement "le jour suivant", mais exactement 24 heures — ce sont deux choses différentes. \n
Vous voulez un exemple ? Le 28 mars 2021 en Ukraine, les horloges ont été avancées d'une heure à 3h00 du matin. Si vous avez ajouté un timeInterval à 2h30 du matin, vous n'obtiendrez pas 3h30, mais... 4h30 ? Ou 2h30 ? Cela dépend de la façon dont le système gère le changement. Bref, le chaos.
Erreur n°2 : Mélanger NSDate et Date dans un même projet
\n\nSwift propose deux types de dates : l'ancien NSDate (issu d'Objective-C) et le moderne Date (natif Swift). De nombreux développeurs, en particulier ceux qui lisent de vieux tutoriels ou des réponses Stack Overflow de 2014, continuent d'utiliser NSDate.
Le problème est que NSDate est une classe (reference type), tandis que Date est une structure (value type). Les mélanger dans le code entraîne :
- \n
- Des bugs peu évidents liés à la mutabilité \n
- Des conversions inutiles (
as Date,as NSDate) - De la confusion dans l'API
Règle : dans le nouveau code Swift, utilisez uniquement Date. Réservez NSDate pour la compatibilité avec les bibliothèques Objective-C.
Erreur n°3 : Ignorer Calendar et TimeZone
\n\nLorsque vous ajoutez "1 jour" à une date, vous le faites dans le contexte d'un calendrier. Sans spécifier de calendrier, le système utilise Calendar.current — le calendrier de l'utilisateur (généralement grégorien).
Mais que faire si l'utilisateur d'Arabie Saoudite utilise le calendrier islamique ? Ou le calendrier japonais ? Sans spécifier explicitement le calendrier, vous risquez d'obtenir des résultats inattendus.
\n\nExemple de code incorrect
\nvar dateComponents = DateComponents()\ndateComponents.day = 1\nlet tomorrow = Calendar.current.date(byAdding: dateComponents, to: Date())\n\nCe code est presque correct, mais il utilise implicitement le fuseau horaire de l'appareil. Si vous travaillez avec des dates serveur en UTC et que l'utilisateur se trouve à Moscou (UTC+3), alors "demain" peut arriver 3 heures plus tôt.
\n\nLa solution correcte : Calendar + DateComponents
\n\nLa méthode standard pour ajouter un jour
\nVoici comment ajouter correctement 1 jour à