Rust の Unix タイムスタンプ スニペット
現在の Unix 秒・ミリ秒、chrono ベースの整形、エポック値の読みやすい UTC 文字列への変換を行う Rust の例。
Current Unix timestamp (seconds)
use std::time::{SystemTime, UNIX_EPOCH};
let ts = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs();Current Unix timestamp (milliseconds)
use std::time::{SystemTime, UNIX_EPOCH};
let ms = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_millis();With the chrono crate
// Cargo.toml: chrono = "0.4"
use chrono::Utc;
Utc::now().timestamp() // seconds
Utc::now().timestamp_millis() // millisecondsFormat with chrono
use chrono::{DateTime, TimeZone, Utc};
let dt: DateTime<Utc> = Utc.timestamp_opt(1700000000, 0).unwrap();
println!("{}", dt.to_rfc3339());
println!("{}", dt.format("%Y-%m-%d %H:%M:%S"));Rust のタイムスタンプの基本
標準ライブラリは依存関係なしのタイムスタンプ計算のために SystemTime と UNIX_EPOCH を公開しています。duration_since(UNIX_EPOCH) は秒・ミリ秒・マイクロ秒・ナノ秒として読み取れます。
Rust でタイムスタンプを整形する
人間が読める日付には、多くの Rust プロジェクトが chrono クレートを使います。エポック秒を UTC の DateTime に変換し、ログやユーザーインターフェイス向けに RFC3339 またはカスタム文字列として整形します。
Rust の本番運用メモ
Rust の標準ライブラリは期間の計測と Unix 時間の読み取りには十分ですが、暦の整形には chrono や time といったクレートのほうが適しています。外部のタイムスタンプは負値・大きすぎ・誤った単位のことがあるため、失敗しうる変換は入力処理の近くに置きます。
- SystemTime からの標準的な Unix 秒には as_secs() を使う
- JavaScript 互換のタイムスタンプには as_millis() を使う
- 解析、タイムゾーン対応の整形、RFC3339 出力が必要なときは chrono または time を使う
- 外部タイムスタンプの単位を、型付き構造体に保存する前に検証する
FAQ
- SystemTime は 1970 年より前の日付を扱えるか?
- SystemTime は Unix エポック付近の時刻を表現できますが、duration_since(UNIX_EPOCH) はそれより前の瞬間に対してエラーを返します。外部のタイムスタンプが負になり得る場合はそのケースを処理してください。
- すべてのタイムスタンプに chrono が必要か?
- いいえ。現在の Unix 秒・ミリ秒には標準ライブラリで十分です。パース、整形、カレンダーロジックが必要なときは chrono または time を使ってください。
- Rust のタイムスタンプの単位を検証するには?
- サンプル値を chrono または time で RFC3339 に変換し、そのフィールドを秒またはミリ秒として受け入れる前に、API やデータベースの契約と一致することを確認します。