Timestamp Formats

Unix タイムスタンプの形式を解説

すべての Unix タイムスタンプ形式の完全リファレンス——秒、ミリ秒、マイクロ秒、ISO 8601、RFC 2822——各言語とデータベースがどの形式を使うかを示す例と、ひと目で見分ける方法を添えて。

すべての Unix タイムスタンプ形式をひと目で

Unix タイムスタンプは単なる数値であり、その形式とは実はその単位——1970 年 1 月 1 日 UTC からどれだけ細かく数えるか——にすぎません。単位はほぼ常に桁数から読めます:10 桁は秒、13 はミリ秒、16 はマイクロ秒、19 はナノ秒。2 つの文字列形式、ISO 8601 と RFC 2822 は、代わりに自己記述的です。下の表は全体像で、その後の各節で各形式と見分け方を扱います。

形式桁数使う側
101700000000Python, PHP, Go, Ruby, C, SQL
ミリ秒131700000000000JavaScript, Java, .NET
マイクロ秒161700000000000000PostgreSQL, Rust
ナノ秒191700000000000000000Go UnixNano, トレーシング系
ISO 8601文字列2023-11-15T06:13:20ZAPI、ログ(自己記述的)
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 年付近または遠い未来の日付に変換されるなら、単位を読み違えています。