Arbeiten mit Zeitzonen in Rust: Ein vollständiger Leitfaden für Backend-Entwickler

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum Zeit eine Kopfschmerz ist

\n\n

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

In 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!

\n\n

Warum die Rust-Standardbibliothek nicht ausreicht?

\n\n

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

\n\n

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:

\n\n
[dependencies]\nchrono = { version = "0.4", features = ["serde"] }
\n\n

Das Flag serde wird für die Serialisierung/Deserialisierung benötigt – nützlich, wenn Sie mit JSON-APIs arbeiten.

\n\n

Grundlagen von chrono: UTC, Local und naive Zeit

\n\n

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

Schauen wir uns an, wie man die aktuelle Zeit in verschiedenen Zonen erhält:

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

Fü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!

\n\n

Konvertierung zwischen Zeitzonen

\n\n

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

Verwenden Sie die Methode with_timezone:

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

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

\n\n

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