Unix タイムスタンプの形式を解説
すべての Unix タイムスタンプ形式の完全リファレンス——秒、ミリ秒、マイクロ秒、ISO 8601、RFC 2822——各言語とデータベースがどの形式を使うかを示す例と、ひと目で見分ける方法を添えて。
すべての Unix タイムスタンプ形式をひと目で
Unix タイムスタンプは単なる数値であり、その形式とは実はその単位——1970 年 1 月 1 日 UTC からどれだけ細かく数えるか——にすぎません。単位はほぼ常に桁数から読めます:10 桁は秒、13 はミリ秒、16 はマイクロ秒、19 はナノ秒。2 つの文字列形式、ISO 8601 と RFC 2822 は、代わりに自己記述的です。下の表は全体像で、その後の各節で各形式と見分け方を扱います。
| 形式 | 桁数 | 例 | 使う側 |
|---|---|---|---|
| 秒 | 10 | 1700000000 | Python, PHP, Go, Ruby, C, SQL |
| ミリ秒 | 13 | 1700000000000 | JavaScript, Java, .NET |
| マイクロ秒 | 16 | 1700000000000000 | PostgreSQL, Rust |
| ナノ秒 | 19 | 1700000000000000000 | Go UnixNano, トレーシング系 |
| ISO 8601 | 文字列 | 2023-11-15T06:13:20Z | API、ログ(自己記述的) |
| RFC 2822 | 文字列 | Wed, 15 Nov 2023 06:13:20 GMT | メール、HTTP ヘッダー |
秒単位の Unix 時間 —— 普遍的な形式
最も一般的な形式:1970 年 1 月 1 日 00:00:00 UTC からの整数秒を数える 32 ビットまたは 64 ビット整数。現在は約 17 億の 10 桁の数値です。
- 例:1700000000 = 2023-11-15 06:13:20 UTC
- 使う側:Python time.time(), PHP time(), Go time.Now().Unix(), Ruby Time.now.to_i, C time(NULL)
- 格納形式:32 ビット int(旧式、最大年 2038)、64 ビット int(現代、数十億年安全)
- データベース:MySQL UNIX_TIMESTAMP(), PostgreSQL EXTRACT(EPOCH FROM NOW())::BIGINT
ミリ秒単位の Unix 時間 —— JavaScript の形式
Unix エポックからのミリ秒:ミリ秒精度を提供する 13 桁の整数。これは JavaScript の Date オブジェクトが内部で使う形式です。
- 例:1700000000000 = 2023-11-15 06:13:20.000 UTC
- 使う側:JavaScript Date.now(), Java System.currentTimeMillis(), .NET DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
- 秒へ変換:Math.floor(ms / 1000)
- 秒から変換:seconds * 1000
ISO 8601 —— 人間可読な標準
ISO 8601 は日付と時刻を文字列として表す国際標準です。Unix タイムスタンプと違い、自己記述的です:形式は日付/時刻とタイムゾーンオフセットの両方を符号化します。
- 2023-11-15T06:13:20Z —— UTC(Z 接尾辞は UTC を意味する)
- 2023-11-15T01:13:20-05:00 —— 明示的な UTC オフセット付き(EST)
- 2023-11-15T06:13:20.000Z —— ミリ秒付き
- JavaScript:date.toISOString() は常に Z 接尾辞の UTC を返す
- Python:datetime.isoformat()、Go:time.Format(time.RFC3339)
RFC 2822 —— メールと HTTP の日付形式
RFC 2822(メールは RFC 5322 で更新、HTTP は RFC 9110 で踏襲)は、メールヘッダーと HTTP 応答で使われる人間可読な日付形式です。JavaScript の Date.toUTCString() はこの形式を返します。
- 例:Wed, 15 Nov 2023 06:13:20 GMT
- 使われる場所:HTTP 応答ヘッダー(Last-Modified, Date, Expires)、メールヘッダー(Date:)
- JavaScript:date.toUTCString()
- 現代の API では少ないが、Web インフラではいまだ広く見かける
タイムスタンプ形式の見分け方
未知のタイムスタンプ値を受け取ったら、これらの規則でその形式を特定できます。桁数があらゆる数値ケースを決め、2 つの文字列形式は一見して明らかです。
| 手がかり | 形式 |
|---|---|
| 10 桁 | Unix 秒 |
| 13 桁 | Unix ミリ秒 |
| 16 桁 | マイクロ秒 |
| 19 桁 | ナノ秒 |
| T または Z を含む | ISO 8601 |
| カンマまたは曜日名 | RFC 2822 |
| 負の整数 | 1970 年より前の秒またはミリ秒 |
- 妥当性チェック:どの数値も現代(10 桁秒ならおおよそ 2001〜2038 年)の信じられる日付にデコードされるべき
- 1970 年付近や数千年先の日付は、単位を読み違えたことを意味する
マイクロ秒とナノ秒
一部の高精度システムはミリ秒より小さい単位を使います。アプリケーションコードでは稀ですが、低レベルシステム、データベース内部、オブザーバビリティツールに現れます。
- マイクロ秒(µs):16 桁整数 —— Rust SystemTime as_micros(), PostgreSQL clock_gettime()
- ナノ秒(ns):19 桁整数 —— Go time.Now().UnixNano(), Rust SystemTime as_nanos()
- PostgreSQL EXTRACT(EPOCH) はマイクロ秒を小数部とする浮動小数点数を返す
- ナノ秒を秒に変換:1,000,000,000(1e9)で割る
分解能と秒未満の精度
上記の各形式は異なる時間分解能を持ちます。形式を選ぶとは、2 つの瞬間をどれだけ細かく区別できるか——1 秒から 1 ナノ秒まで——を選ぶことです。
- 1 秒分解能:Unix 秒(10 桁)、伝統的な POSIX time_t
- 1 ミリ秒:JavaScript Date, MongoDB BSON Date, Java Instant.toEpochMilli()
- 1 マイクロ秒:Chrome/WebKit タイムスタンプ, Python datetime.timestamp(), PostgreSQL timestamp precision 6
- 100 ナノ秒:Windows FILETIME, .NET DateTime.Ticks
- 1 ナノ秒:Java Instant(完全精度), Go time.UnixNano(), JS Temporal.Instant.epochNanoseconds(BigInt)
- ピコ秒以下:PTP/IEEE 1588 のワイヤ形式(1 秒の 1/2^32)、NTP の小数フィールド
- 必要を満たす最も粗い分解能を選ぶ —— 秒未満の精度は JSON シリアライズや文字列の往復でしばしば失われる
- 形式を変換するときは Unix ミリ秒またはナノ秒(BigInt 経由)を通す —— それが精度を保つ最小公分母
タイムスタンプ形式コンバーター
Unix 時間と、現場で出会うプラットフォーム固有のタイムスタンプ形式の間で変換:
FAQ
- Unix タイムスタンプは何桁ですか?
- 現代の秒単位の Unix タイムスタンプは 10 桁(約 17 億)、ミリ秒単位なら 13 桁です。マイクロ秒は 16 桁、ナノ秒は 19 桁です。
- JavaScript はどのタイムスタンプ形式を使いますか?
- JavaScript の Date はミリ秒で動きます——Date.now() は 13 桁のミリ秒タイムスタンプを返し、new Date(ms) はミリ秒を期待します。Date に渡す前に Unix 秒を 1000 倍してください。
- Unix 時間と ISO 8601 の違いは何ですか?
- Unix 時間は 1970 年 UTC からの秒またはミリ秒の単一の数値で、タイムゾーンを持ちません。ISO 8601 は 2023-11-15T06:13:20Z のような自己記述的な文字列で、日付・時刻・オフセットを符号化します。
- RFC 2822 の日付形式とは何ですか?
- RFC 2822(RFC 5322 で更新)は、メールや HTTP ヘッダーで使われる人間可読な日付形式で、"Wed, 15 Nov 2023 06:13:20 GMT" のようなものです。JavaScript は date.toUTCString() で生成します。
- タイムスタンプが秒かミリ秒かをどう見分けますか?
- 桁を数えます——10 桁の値は秒、13 桁の値はミリ秒です。値が 1970 年付近または遠い未来の日付に変換されるなら、単位を読み違えています。