Comment obtenir l'heure actuelle en Swift : 5 erreurs fatales et leurs solutions

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

Le temps n'est pas qu'une question de chiffres : pourquoi même les développeurs expérimentés se trompent

\n\n

Chaque développeur iOS a déjà été confronté à la tâche : « il suffit d'obtenir l'heure actuelle ». Rien de plus simple, semble-t-il. Mais c'est précisément ici, sur un terrain plat, que les débutants (et pas seulement) commettent des erreurs qui se transforment ensuite en bugs, en plantages d'applications et en utilisateurs mécontents.

\n\n

Dans cet article, nous allons analyser les cinq erreurs les plus courantes lors du travail avec l'heure actuelle en Swift, qui ont accumulé des milliers de vues sur Stack Overflow. Vous apprendrez à les éviter et à écrire un code propre et fiable.

\n\n
« Je veux juste obtenir l'heure actuelle comme datetime en Swift, mais j'obtiens soit nil, soit quelque chose d'inattendu. Aidez-moi ! » — un cri de détresse typique sur les forums.
\n\n

Voyons ce qui ne va pas.

\n\n

1. Erreur avec DateFormatter : la locale, l'ennemi principal

\n\n

Problème

\n

La requête la plus populaire : « Swift get current time as datetime string ». Le développeur écrit :

\n\n
let dateFormatter = DateFormatter()\ndateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"\nlet currentTime = dateFormatter.string(from: Date())\nprint(currentTime) // Ça marche ? Pas tout à fait
\n\n

Dans le simulateur ou sur un appareil avec une locale anglaise, tout va bien. Mais dès que l'utilisateur choisit, par exemple, l'allemand ou le russe dans les paramètres, vous obtenez nil ou un format inattendu.

\n\n

Pourquoi cela se produit-il ?

\n

Par défaut, DateFormatter utilise la locale actuelle de l'appareil. Pour les formats de date fixes qui sont analysés ou affichés dans une API, c'est une catastrophe.

\n\n

Solution

\n

Définissez toujours la locale en_US_POSIX pour les formats qui ne sont pas destinés à être affichés à l'utilisateur :

\n\n
let dateFormatter = DateFormatter()\ndateFormatter.locale = Locale(identifier: "en_US_POSIX")\ndateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"\ndateFormatter.timeZone = TimeZone.current // N'oublions pas le fuseau horaire !\nlet currentTime = dateFormatter.string(from: Date())\nprint(currentTime) // "2024-12-25 14:30:00" — stable
\n\n
Souvenez-vous : en_US_POSIX est votre meilleur ami lorsque vous travaillez avec des formats de date fixes en Swift.
\n\n

2. Ignorer le fuseau horaire (TimeZone)

\n\n

Problème

\n

Vous avez obtenu une chaîne avec l'heure actuelle. Mais quelle heure avez-vous réellement obtenue ? Locale ? UTC ? Serveur ? L'erreur se produit lorsque le développeur ne spécifie pas timeZone dans DateFormatter.

\n\n

Exemple d'erreur :

\n
let formatter = DateFormatter()\nformatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"\nlet now = formatter.string(from: Date())\n// Résultat : "2024-12-25T14:30:00+0300" — c'est l'heure locale avec le décalage\n// Mais que faire si vous avez toujours besoin d'UTC ?
\n\n

Solution

\n

Spécifiez toujours explicitement le TimeZone :

\n\n
// Pour travailler avec le serveur (UTC)\nlet utcFormatter = DateFormatter()\nutcFormatter.timeZone = TimeZone(abbreviation: "UTC")\nutcFormatter.locale = Locale(identifier: "en_US_POSIX")\nutcFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"\nlet utcTime = utcFormatter.string(from: Date())\nprint(utcTime) // "2024-12-25T11:30:00Z"\n\n// Pour l'affichage à l'utilisateur (son heure locale)\nlet localFormatter = DateFormatter()\nlocalFormatter.timeZone = TimeZone.current\nlocalFormatter.dateStyle = .medium\nlocalFormatter.timeStyle = .short\nlet localTime = localFormatter.string(from: Date())\nprint(localTime) // "25 déc. 2024, 14:30"
\n\n

3. Utiliser Date() pour la comparaison : les pièges

\n\n

Problème

\n

Beaucoup pensent que Date() renvoie la même valeur dans le cadre d'un même appel. Mais ce n'est pas le cas. Swift Date est un instantané du temps. Si vous appelez Date() deux fois dans le code, les valeurs peuvent différer de quelques microsecondes.

\n\n


                
                

Blogs

Book Recommendations