Fortgeschrittene Arbeit mit Datum und Zeit in Rust: chrono und time

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

\n\n

In der modernen Entwicklung mit Rust geht die Arbeit mit Datum und Zeit weit über das einfache Abrufen des aktuellen Zeitpunkts hinaus. Bei der Erstellung von hochbelasteten Systemen, Finanzanwendungen oder verteilten Diensten ist eine genaue Berücksichtigung von Zeitzonen, effizientes Parsing, Serialisierung und komplexe Zeitberechnungen erforderlich. In diesem Artikel betrachten wir fortgeschrittene Techniken für die Arbeit mit Datum und Zeit unter Verwendung der Crates chrono und time.

\n\n

1. Bibliothek chrono: Grundlage für fortgeschrittene Arbeit

\n\n

Das Crate chrono ist der De-facto-Standard für die Arbeit mit Datum und Zeit in Rust. Es bietet zwei Schlüsselabstraktionen: NaiveDateTime (Datum-Zeit ohne Zeitzone) und DateTime<Tz> (Datum-Zeit mit Zeitzonenbindung).

\n\n

Beispiel: Arbeit mit Zeitzonen

\n\n
use chrono::{DateTime, Utc, Local, FixedOffset, NaiveDateTime};\nuse chrono::format::ParseError;\n\nfn main() -> Result<(), ParseError> {\n    // Aktuelle Zeit in UTC\n    let utc_now: DateTime<Utc> = Utc::now();\n    println!("UTC now: {}", utc_now);\n\n    // Aktuelle lokale Zeit\n    let local_now: DateTime<Local> = Local::now();\n    println!("Local now: {}", local_now);\n\n    // Konvertierung in eine andere Zeitzone (Moskau, UTC+3)\n    let moscow_offset = FixedOffset::east_opt(3 * 3600).unwrap();\n    let moscow_time = utc_now.with_timezone(&moscow_offset);\n    println!("Moscow time: {}", moscow_time);\n\n    // Parsen eines Strings mit Zeitzone\n    let parsed = DateTime::parse_from_rfc3339("2024-03-15T14:30:00+05:00")?;\n    println!("Parsed with offset: {}", parsed);\n\n    Ok(())\n}
\n\n

Wichtig: Verwenden Sie Utc für die Speicherung in Datenbanken und APIs, und führen Sie die Konvertierung in lokale Zeitzonen nur auf der Präsentationsebene durch.

\n\n

2. Komplexe Zeitberechnungen und Intervalle

\n\n

Die Bibliothek chrono unterstützt Datumsarithmetik mit dem Typ Duration und komplexere Operationen über das Trait TimeDelta. Für die Arbeit mit Intervallen und Perioden (z. B. "nächster Monat") verwenden Sie Months und Weeks.

\n\n

Beispiel: Berechnungen mit Daten

\n\n
use chrono::{NaiveDate, Duration, Months, Datelike, Weekday};\n\nfn main() {\n    let start = NaiveDate::from_ymd_opt(2024, 1, 15).unwrap();\n\n    // Tage hinzufügen\n    let plus_10_days = start + Duration::days(10);\n    println!("+10 days: {}", plus_10_days);\n\n    // Monate hinzufügen (berücksichtigt unterschiedliche Monatslängen)\n    let plus_2_months = start.checked_add_months(Months::new(2)).unwrap();\n    println!("+2 months: {}", plus_2_months);\n\n    // Nächsten Montag finden\n    let next_monday = start.iter_days()\n        .skip(1)\n        .find(|d| d.weekday() == Weekday::Mon)\n        .unwrap();\n    println!("Next Monday: {}", next_monday);\n\n    // Differenz zwischen Daten in Tagen\n    let end = NaiveDate::from_ymd_opt(2024, 12, 31).unwrap();\n    let days_diff = end.signed_duration_since(start).num_days();\n    println!("Days between: {}", days_diff);\n}
\n\n

Tipp: Verwenden Sie für Finanzberechnungen checked_add_months und nicht eine einfache Addition von Tagen, um Monatsenden korrekt zu behandeln (z. B. 31. Januar + 1 Monat = 28./29. Februar).

\n\n

3. Serialisierung und Parsing von Daten mit serde

\n\n

Bei der Arbeit mit JSON, YAML oder Datenbanken ist die korrekte Serialisierung von Daten von entscheidender Bedeutung. Das Crate chrono integriert sich mit serde über das Feature serde. Für benutzerdefinierte Formate verwenden Sie die Attribute #[serde(with = "...")].

\n\n

Beispiel: Serialisierung in ISO 8601 und benutzerdefinierte Formate

\n\n
use chrono::{DateTime, Utc, NaiveDateTime};\nuse serde::{Serialize, Deserialize};\n\n#[derive(Debug, Serialize, Deserialize)]                

Blogs

Buchempfehlungen