Introduction : pourquoi le temps est un casse-tête
\n\nDans tout projet sérieux en Rust, qu'il s'agisse d'un serveur web avec Actix, d'un analyseur de logs ou d'un système de surveillance, tôt ou tard se pose la question : comment gérer correctement les fuseaux horaires en Rust. Cela semble simple, non ? On prend un timestamp, on l'affiche à l'écran, et voilà. Mais la réalité est impitoyable : un fuseau horaire oublié transforme les logs en désordre, et la base de données commence à mentir.
\n\nDans cet article, nous allons voir comment l'écosystème Rust résout le problème du temps. Vous découvrirez pourquoi chrono est devenu le standard de facto, comment ne pas perdre la tête avec UTC et Local, et comment gérer les fuseaux horaires exotiques comme « Asia/Yekaterinburg » sans douleur. C'est parti !
Pourquoi la bibliothèque standard de Rust ne suffit-elle pas ?
\n\nDans std::time, on trouve SystemTime, Instant et Duration. Cela suffit pour les mesures de performance et les minuteurs simples. Mais quand il s'agit de gérer les fuseaux horaires en Rust, la bibliothèque standard est insuffisante : elle ne permet ni l'analyse de chaînes comme "2024-03-15T10:30:00+05:00", ni la gestion des informations sur les fuseaux horaires, ni la conversion d'UTC en heure locale.
C'est ici qu'entre en scène la crate chrono. C'est un couteau suisse pour les dates et heures en Rust. Installons-la dans Cargo.toml :
[dependencies]\nchrono = { version = "0.4", features = ["serde"] }\n\nLe flag serde est nécessaire pour la sérialisation/désérialisation — utile si vous travaillez avec une API JSON.
Les bases de chrono : UTC, Local et le temps naïf
\n\nDans chrono, il existe trois types principaux pour représenter un instant dans le temps :
\n\n- \n
DateTime<Utc>— l'heure en UTC. Le standard d'or pour les serveurs. \n DateTime<Local>— l'heure locale du système. Pratique pour les logs sur un ordinateur de bureau. \n NaiveDateTime— le temps "naïf" sans fuseau horaire. Dangereux, mais parfois nécessaire. \n
Voyons comment obtenir l'heure actuelle dans différentes zones :
\n\nuse chrono::{Utc, Local, DateTime};\n\nfn main() {\n let utc_now: DateTime<Utc> = Utc::now();\n println!("Maintenant en UTC : {}", utc_now);\n\n let local_now: DateTime<Local> = Local::now();\n println!("Maintenant en local : {}", local_now);\n}\n\nExécutez ce code — et vous verrez la différence. Notez que DateTime est un type générique paramétré par le fuseau horaire. Cela signifie que le compilateur ne vous permettra pas d'additionner accidentellement une heure UTC et une heure locale sans conversion explicite. La sécurité des types veille sur le temps !
Conversion entre fuseaux horaires
\n\nLa tâche la plus courante est de convertir l'UTC en heure locale de l'utilisateur. Supposons que votre serveur stocke tout en UTC et que le client se trouve dans le fuseau horaire Asia/Yekaterinburg (UTC+5). Comment faire ?
\n\nUtilisez la méthode with_timezone :
use chrono::{Utc, Local, TimeZone, DateTime};\n\nfn main() {\n let utc_time: DateTime<Utc> = Utc::now();\n \n // Conversion en heure locale du système\n let local_time: DateTime<Local> = utc_time.with_timezone(&Local);\n println!("UTC : {} -> Local : {}", utc_time, local_time);\n \n // Si vous avez besoin d'un fuseau spécifique — utilisez FixedOffset\n let ekb_offset = chrono::FixedOffset::east_opt(5 * 3600).unwrap();\n let ekb_time: DateTime<FixedOffset> = utc_time.with_timezone(&ekb_offset);\n println!("UTC : {} -> EKB : {}", utc_time, ekb_time);\n}\n\nNotez que FixedOffset::east_opt retourne un Option, car tous les décalages ne sont pas valides (par exemple, 25 heures, c'est trop). Gérez toujours le cas None.
Et si votre gestion des fuseaux horaires en Rust est plus complexe qu'un simple décalage fixe ? Par exemple, si vous devez prendre en compte l'heure d'été ? C'est là que la crate
Blogs
Book Recommendations
Lire aussi
Automatisation de tâches avec Swift : de l'ennui à la magie en une commande
Gestion des erreurs en Java : try/catch et bien plus — guide complet
Devenir Data Scientist avec Python : Guide complet
Le bloc finally est-il toujours exécuté en Java ? Analyse complète avec code
C# pour backend ou frontend : que choisir pour un développeur en 2024