Einleitung: Warum Zeit eine Kopfschmerz ist
\n\nIn jedem ernsthaften Rust-Projekt, sei es ein Webserver mit Actix, ein Log-Parser oder ein Überwachungssystem, stellt sich früher oder später die Frage: Wie arbeitet man in Rust richtig mit Zeitzonen. Man könnte meinen, was gibt es Einfacheres? Man nimmt einen Timestamp, gibt ihn aus – und fertig. Aber die Realität ist grausam: Eine vergessene Zeitzone verwandelt Logs in Chaos, und die Datenbank beginnt zu lügen.
\n\nIn diesem Artikel werden wir untersuchen, wie das Rust-Ökosystem das Zeitproblem löst. Sie erfahren, warum chrono zum De-facto-Standard geworden ist, wie Sie mit UTC und Local nicht verrückt werden und wie Sie exotische Zeitzonen wie „Asia/Yekaterinburg“ ohne Schmerzen verarbeiten. Los geht's!
Warum die Rust-Standardbibliothek nicht ausreicht?
\n\nIn std::time gibt es SystemTime, Instant und Duration. Das reicht für Leistungsmessungen und einfache Timer. Aber wenn es um das Arbeiten mit Zeitzonen in Rust geht, kapituliert die Standardbibliothek: Sie bietet weder Parsing von Strings wie „2024-03-15T10:30:00+05:00“, noch Informationen über Zeitzonen, noch die Umrechnung von UTC in Ortszeit.
Hier kommt die Crate chrono ins Spiel. Es ist das Schweizer Taschenmesser für Datum und Zeit in Rust. Fügen wir sie in Cargo.toml hinzu:
[dependencies]\nchrono = { version = "0.4", features = ["serde"] }\n\nDas Flag serde wird für die Serialisierung/Deserialisierung benötigt – nützlich, wenn Sie mit JSON-APIs arbeiten.
Grundlagen von chrono: UTC, Local und naive Zeit
\n\nIn chrono gibt es drei Haupttypen zur Darstellung eines Zeitpunkts:
\n\n- \n
DateTime<Utc>– Zeit in UTC. Der Goldstandard für Server. \n DateTime<Local>– Ortszeit des Systems. Praktisch für Logs auf dem Desktop. \n NaiveDateTime– „Naive“ Zeit ohne Zeitzone. Gefährlich, aber manchmal nötig. \n
Schauen wir uns an, wie man die aktuelle Zeit in verschiedenen Zonen erhält:
\n\nuse chrono::{Utc, Local, DateTime};\n\nfn main() {\n let utc_now: DateTime<Utc> = Utc::now();\n println!("Aktuelle Zeit in UTC: {}", utc_now);\n\n let local_now: DateTime<Local> = Local::now();\n println!("Aktuelle Ortszeit: {}", local_now);\n}\n\nFühren Sie diesen Code aus – und Sie werden den Unterschied sehen. Beachten Sie: DateTime ist ein generischer Typ, der mit der Zeitzone parametrisiert wird. Das bedeutet, der Compiler lässt Sie nicht versehentlich Zeit aus UTC und Local ohne explizite Konvertierung addieren. Typsicherheit schützt die Zeit!
Konvertierung zwischen Zeitzonen
\n\nDie häufigste Aufgabe ist die Umrechnung von UTC in die Ortszeit des Benutzers. Angenommen, Ihr Server speichert alles in UTC und der Client befindet sich in der Zeitzone Asia/Yekaterinburg (UTC+5). Wie macht man das?
\n\nVerwenden Sie die Methode with_timezone:
use chrono::{Utc, Local, TimeZone, DateTime};\n\nfn main() {\n let utc_time: DateTime<Utc> = Utc::now();\n \n // Konvertieren in die Ortszeit des Systems\n let local_time: DateTime<Local> = utc_time.with_timezone(&Local);\n println!("UTC: {} -> Local: {}", utc_time, local_time);\n \n // Wenn eine bestimmte Zeitzone benötigt wird – FixedOffset verwenden\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\nBeachten Sie: FixedOffset::east_opt gibt ein Option zurück, da nicht jeder Offset gültig ist (z. B. 25 Stunden sind übertrieben). Behandeln Sie None immer.
Und was ist, wenn Ihr Arbeiten mit Zeitzonen in Rust komplexer ist als nur ein fester Offset? Zum Beispiel, wenn Sommerzeit berücksichtigt werden muss? Hier kommt die Crate
Blogs
Buchempfehlungen
Lesen Sie auch
Wie man in 30 Minuten ein REST API mit TypeScript schreibt: in der Praxis
Asynchrone Programmierung in Rust: Vollständiger Leitfaden mit Beispielen
Sortierung eines 2D-Arrays nach Spalte in PHP: Ein Blick unter die Haube
Datenparsing und Scraping mit PHP: Vom Einfachen zum Professionellen
Monorepository mit JavaScript: Code-Organisation in der Praxis