Zeit in Millisekunden in Rust: Tappen Sie nicht in diese 5 Fallen
\n\n„Wie erhalte ich die aktuelle Zeit in Millisekunden?“ – diese Frage auf Stack Overflow hat tausende Aufrufe gesammelt. Was könnte einfacher sein? Aber Rust ist nicht Python und nicht JavaScript. Hier verwechselt man leicht den UNIX-Timestamp mit der monotonen Zeit, vergisst die Plattformabhängigkeit oder tritt in die Leistungsfalle.
In diesem Artikel analysieren wir die Top-Fehler, die Anfänger (und nicht nur sie) bei der Arbeit mit Zeit in Rust machen. Sie erfahren, wie Sie die Zeit in Millisekunden korrekt, zuverlässig und schnell erhalten. Los geht's!
\n\nFehler Nr. 1: Monotone Zeit anstelle von UNIX-Zeit
\n\nDie häufigste Falle ist die Verwendung von std::time::Instant, um die „aktuelle Zeit“ zu erhalten. Instant in Rust misst die monotone Zeit – ideal für Intervallmessungen, aber absolut nutzlos, wenn Sie einen Timestamp benötigen (z. B. für Logging oder das Senden an einen Server).
// ❌ FEHLER: So erhält man keinen Timestamp\nuse std::time::Instant;\n\nlet now = Instant::now();\n// Instant hat keine Methode duration_since(UNIX_EPOCH)!\n// Sie erhalten einen Kompilierungsfehler\n\n\nWie macht man es richtig? Verwenden Sie std::time::SystemTime. Dieser Typ kennt die Systemzeit und kann von UNIX_EPOCH (1. Januar 1970) aus zählen.
use std::time::{SystemTime, UNIX_EPOCH};\n\nlet now = SystemTime::now()\n .duration_since(UNIX_EPOCH)\n .expect("Die Zeit ist rückwärts gelaufen?");\n \nlet millis = now.as_millis(); // u128\nprintln!("Aktuelle Zeit in ms: {}", millis);\n\n\n💡 Tipp: duration_since gibt ein Result zurück, da die Systemzeit theoretisch vor 1970 eingestellt sein könnte. Auf modernen Systemen kann diese Ausnahme getrost mit expect oder unwrap behandelt werden.
Fehler Nr. 2: Plattformabhängigkeit vergessen
\n\nMan sollte meinen, SystemTime::now() sei eine plattformunabhängige Lösung. Aber es gibt einen Haken. Auf einigen Plattformen (z. B. alte Linux-Kernel oder eingebettete Systeme) kann sich SystemTime instabil verhalten oder die Millisekundengenauigkeit gar nicht unterstützen.
Eine zweite Falle ist der Überlauf. Der Typ u128 in as_millis() wird kaum überlaufen (reicht für Milliarden von Jahren), aber wenn Sie die Zeit in einer Datenbank speichern oder über ein Netzwerk übertragen müssen – Millisekunden in u128 können für andere Systeme eine Überraschung sein.
// ✅ Sichere Umwandlung in u64 (reicht für ~584 Millionen Jahre)\nlet millis_u64: u64 = now.as_millis() as u64;\n\n\nWie vermeidet man das? Überprüfen Sie immer die Dokumentation für Ihre Zielplattform. Für eingebettete Systeme sollten Sie die Crate embassy-time oder std::time mit Vorsicht in Betracht ziehen.
Fehler Nr. 3: Die Crate chrono ignorieren
\n\nDie Standardbibliothek von Rust bietet grundlegende Funktionen. Aber wenn Sie mit Zeitzonen, Formatierung oder Datumsparsing arbeiten müssen – erfinden Sie das Rad nicht neu. Die Crate chrono ist der De-facto-Standard für die Arbeit mit Datum und Zeit in Rust.
// Fügen Sie in Cargo.toml hinzu: chrono = "0.4"\nuse chrono::Utc;\n\nlet now = Utc::now();\nlet millis = now.timestamp_millis(); // i64\nprintln!("Chrono-Timestamp: {}", millis);\n\n\n⚠️ Wichtig: timestamp_millis() gibt ein i64 zurück, kein u128. Dies dient der Kompatibilität mit der UNIX-Zeit (die für Daten vor 1970 negativ sein kann). In den meisten Fällen ist i64 genau das, was Sie brauchen.
💡 Ko