Rust Snippets

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()  // milliseconds
Format 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 やデータベースの契約と一致することを確認します。