Arbeiten mit Datum und Zeit in Rust: Fortgeschrittene Techniken und Bibliotheken

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

Fortgeschrittene Arbeit mit Datum und Zeit in Rust: von NaiveDateTime bis Timezone



Die Arbeit mit Datum und Zeit ist eine der häufigsten Aufgaben in der Backend-Entwicklung, Protokollierung, Finanzsystemen und Datenverarbeitung. In Rust bietet die Standardbibliothek das Basismodul std::time, aber für ernsthafte Projekte reicht es nicht aus. Auf fortgeschrittenem Niveau greifen wir auf die Crate chrono zurück – den De-facto-Standard für die Arbeit mit Datum und Zeit. In diesem Artikel behandeln wir komplexe Szenarien: Arbeit mit Zeitzonen, Parsen nicht standardisierter Formate, Manipulation von Dauern und Leistungsoptimierung.



1. Installation und grundlegende Struktur von chrono



Fügen Sie die Abhängigkeit in Cargo.toml hinzu:



[dependencies]chrono = { version = "0.4", features = ["serde"] }


Die wichtigsten chrono-Typen für die fortgeschrittene Arbeit:

  • NaiveDateTime — Datum-Uhrzeit ohne Zeitzone (lokal).
  • DateTime<Tz> — Datum-Uhrzeit mit Zeitzonenbindung (z. B. Utc, Local, FixedOffset).
  • Duration — Zeitintervall (unterscheidet sich von std::time::Duration, unterstützt negative Werte).
  • TimeDelta — Synonym für Duration in neueren Versionen.


Beispiel für die Erstellung des aktuellen Moments in UTC und lokaler Zeit:



use chrono::{Utc, Local, DateTime};

fn main() { let utc_now: DateTime<Utc> = Utc::now(); let local_now: DateTime<Local> = Local::now(); println!("UTC: {}", utc_now); println!("Local: {}", local_now);}


2. Arbeit mit Zeitzonen (Timezone)



Eine der leistungsstarken Funktionen von chrono ist die Unterstützung der Olson-Zeitzonendatenbank über die Crate chrono-tz. Dies ermöglicht die Arbeit mit Zonennamen wie "Europe/Moscow" oder "America/New_York".



Installieren Sie:



[dependencies]chrono = "0.4"chrono-tz = "0.8"


Beispiel für die Umrechnung der Zeit zwischen Zonen:



use chrono::{Utc, DateTime, TimeZone};use chrono_tz::Europe::Moscow;

fn main() { let utc_time: DateTime<Utc> = Utc::now(); let moscow_time = utc_time.with_timezone(&Moscow); println!("UTC: {}", utc_time); println!("Moscow: {}", moscow_time);}


Ein wichtiger Punkt: Speichern Sie die Zeit immer in UTC in der Datenbank und konvertieren Sie sie nur bei der Anzeige für den Benutzer in die lokale Zeit. Dies verhindert Verwirrung mit Sommer-/Winterzeit.



2.1. Arbeit mit FixedOffset



Wenn Sie einen festen Offset kennen (z. B. +03:00), verwenden Sie FixedOffset:



use chrono::{FixedOffset, DateTime, Utc};

fn main() { let offset = FixedOffset::east_opt(3 * 3600).unwrap(); // +03:00 let now_utc: DateTime<Utc> = Utc::now(); let now_offset = now_utc.with_timezone(&offset); println!("Mit Offset +03:00: {}", now_offset);}


3. Parsen und Formatieren von Daten (fortgeschrittene Techniken)



Das Standard-Parsen über parse_from_str erfordert ein genaues Format. In realen Projekten können sich die Formate jedoch unterscheiden (z. B. Logs von verschiedenen Systemen). Betrachten wir mehrere Ansätze.



3.1. Mehrere Formate mit try_parse



Verwenden Sie das Durchgehen von Formaten:



use chrono::NaiveDateTime;

fn parse_flexible(date_str: &str) -> Option<NaiveDateTime> { let formats = [ "%Y-%m-%d %H:%M:%S", "%d/%m/%Y %H:%M", "%Y%m%dT%H%M%S", "%b %d %Y %I:%M:%S%p", ];

for fmt in &formats { if let Ok(dt) = NaiveDateTime::parse_from_str(date_str, fmt) { return Some(dt); } } None}

fn main() { let dates = vec![ "2024-03-15 14:30:00", "15/03/2024 14:30", "2

Blogs

Buchempfehlungen