Einführung in die Arbeit mit Datum und Uhrzeit in Rust
Die Arbeit mit Datum und Uhrzeit ist eine der Kernaufgaben in jeder modernen Anwendung. Ob es sich um Ereignisprotokollierung, Aufgabenplanung, Verarbeitung von Benutzerdaten oder die Arbeit mit APIs handelt – ohne korrekte Verwaltung von Zeitstempeln kommt man nicht aus. In der für ihre Leistung und Sicherheit bekannten Sprache Rust bietet die Standardbibliothek nur einen minimalen Satz an Werkzeugen für die Arbeit mit Zeit. Hier kommt jedoch die leistungsstarke Crate chrono zur Hilfe, die sich als De-facto-Standard für die Arbeit mit Datum und Uhrzeit im Rust-Ökosystem etabliert hat.
In diesem Artikel werden wir im Detail behandeln, wie man chrono installiert und verwendet, wie man Daten erstellt, formatiert, parst und manipuliert, sowie wie man mit Zeitzonen und Unix-Zeitstempeln arbeitet.
Installation und Einbindung der Crate chrono
Um zu beginnen, muss die Abhängigkeit chrono in der Datei Cargo.toml Ihres Projekts hinzugefügt werden:
[dependencies]chrono = "0.4"Danach können die notwendigen Typen und Traits im Code importiert werden:
use chrono::{DateTime, Utc, Local, NaiveDate, NaiveDateTime, Duration, Datelike, Timelike, TimeZone};Die Crate chrono bietet mehrere Schlüsseltypen zur Darstellung von Datum und Uhrzeit:
NaiveDate— Datum ohne Uhrzeit und Zeitzone (z. B. 2024-01-15).NaiveTime— Uhrzeit ohne Datum und Zeitzone (z. B. 14:30:00).NaiveDateTime— Kombination von Datum und Uhrzeit ohne Berücksichtigung der Zeitzone.DateTime<Utc>— Datum und Uhrzeit mit der Zeitzone UTC.DateTime<Local>— Datum und Uhrzeit mit der lokalen Zeitzone des Systems.DateTime<FixedOffset>— Datum und Uhrzeit mit einem beliebigen Offset von UTC.
Erstellen und Abrufen der aktuellen Zeit
Der einfachste Weg, den aktuellen Zeitpunkt zu erhalten, ist die Verwendung der Funktionen Utc::now() und Local::now():
use chrono::{Utc, Local};
fn main() { let utc_now: DateTime<Utc> = Utc::now(); let local_now: DateTime<Local> = Local::now(); println!("Aktuelle UTC-Zeit: {}", utc_now); println!("Aktuelle lokale Zeit: {}", local_now);}Um ein bestimmtes Datum zu erstellen, können die Methoden NaiveDate::from_ymd und NaiveDateTime::new verwendet werden:
use chrono::{NaiveDate, NaiveDateTime, NaiveTime};
fn main() { // Erstellen des Datums 15. März 2024 let date = NaiveDate::from_ymd(2024, 3, 15); println!("Datum: {}", date); // Erstellen der Uhrzeit 10:30:00 let time = NaiveTime::from_hms(10, 30, 0); println!("Uhrzeit: {}", time); // Kombination von Datum und Uhrzeit let datetime = NaiveDateTime::new(date, time); println!("Datum und Uhrzeit: {}", datetime);}Man kann auch ein Datum mit einer Zeitzone erstellen, indem man die Methode and_hms eines Datums verwendet:
use chrono::{Utc, TimeZone};
fn main() { let datetime_utc = Utc.ymd(2024, 12, 25).and_hms(12, 0, 0); println!("Weihnachten UTC: {}", datetime_utc);}Formatierung und Parsing von Daten
Ausgabeformatierung
Zur Umwandlung eines Datums in einen String wird die Methode format verwendet, die einen Format-String akzeptiert. Die Formatspezifizierer ähneln denen in Python und anderen Sprachen:
use chrono::{Utc, DateTime};
fn main() { let now = Utc::now(); // Basis-Formatierung println!("Standard: {}", now.format("%Y-%m-%d %H:%M:%S")); println!("Nur Datum: {}", now.format("%d.%m.%Y")); println!("Mit Monatsname: {}", now.format("%d. %B %Y")); println!("Uhrzeit mit Sekunden: {}", now.format("%H:%M:%S")); println!("Unix timestamp: {}", now.timestamp());}```