秒 vs ミリ秒のTimestamp

秒ベースとミリ秒ベースのUnix timestampの違いを理解する。検出方法、変換方法、timestampの精度に関するよくあるバグの回避方法を解説。

Concept

1700000000 vs 1700000000000

詳細な説明

timestampバグの最も一般的な原因の一つが、秒ベースとミリ秒ベースのtimestampの混同です。1700000000という秒timestampは2023年11月14日を表しますが、末尾にゼロが3つ追加された1700000000000はミリ秒timestampとして同じ瞬間を、より細かい精度で表します。

見分け方:

最もシンプルな判断方法は桁数です。2020年代時点で、秒ベースのUnix timestampは10桁、ミリ秒timestampは13桁です。このルールは2001年から2286年まで確実に有効です。

10桁 → 秒        (例: 1700000000)
13桁 → ミリ秒     (例: 1700000000000)
16桁 → マイクロ秒  (例: 1700000000000000)
19桁 → ナノ秒     (例: 1700000000000000000)

言語ごとの使用単位:

単位 言語/システム
Python, PHP, Ruby, Bash, Go, C, MySQL
ミリ秒 JavaScript, Java, Dart, C# (DateTimeOffset)

相互変換:

// ミリ秒から秒へ
const seconds = Math.floor(milliseconds / 1000);

// 秒からミリ秒へ
const ms = seconds * 1000;

よくあるバグのシナリオ: JavaScriptのDate.now()値(ミリ秒)をデータベースに保存し、秒を期待するPythonスクリプトでそれを読み取ると、数万年先の未来の日付として解釈されます。対策として、APIの境界では常にtimestampの単位を明記し、一貫して変換することが重要です。

API設計のヒント: APIを設計する際は、フィールド名に単位を明示してください(例:created_at_msexpires_at_unix_seconds)。これにより曖昧さがなくなり、APIの利用者のデバッグ時間を大幅に節約できます。StripeやTwilioなど多くの主要APIは、秒ベースのtimestampを使用し、それを明確にドキュメントに記載しています。

ユースケース

新しく作成したリソースの有効期限が55000年と表示される場合、ほぼ確実にフロントエンドのJavaScriptとバックエンドのPython間での秒 vs ミリ秒の取り違えが原因です。

Try It — Timestamp Converter

フルツールを開く