Comment ajouter 1 jour à NSDate : 5 erreurs fatales de débutant en Swift

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : pourquoi votre code avec les dates fonctionne "une fois sur deux" ?

\n\n

Imaginez : 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\n

Dans 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.

\n\n

C'est parti pour comprendre les dates une fois pour toutes !

\n\n

Erreur n°1 : Utiliser timeInterval pour ajouter un jour

\n\n

Le code catastrophe

\n

L'erreur la plus fréquente que commettent les débutants :

\n\n
let 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\n

Mais non. Cela ne fonctionne que dans 99% des cas, et dans 1% des cas, cela casse toute l'application pour les utilisateurs. Pourquoi ?

\n\n

Les 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
\n\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.

\n\n

Erreur n°2 : Mélanger NSDate et Date dans un même projet

\n\n

Swift 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.

\n\n

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
    \n
  • Des bugs peu évidents liés à la mutabilité
  • \n
  • Des conversions inutiles (as Date, as NSDate)
  • De la confusion dans l'API
\n\n

Règle : dans le nouveau code Swift, utilisez uniquement Date. Réservez NSDate pour la compatibilité avec les bibliothèques Objective-C.

\n\n

Erreur n°3 : Ignorer Calendar et TimeZone

\n\n

Lorsque 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).

\n\n

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\n

Exemple de code incorrect

\n
var dateComponents = DateComponents()\ndateComponents.day = 1\nlet tomorrow = Calendar.current.date(byAdding: dateComponents, to: Date())
\n\n

Ce 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\n

La solution correcte : Calendar + DateComponents

\n\n

La méthode standard pour ajouter un jour

\n

Voici comment ajouter correctement 1 jour à

Blogs

Book Recommendations