Unix Timestampの最大値

32ビットおよび64ビットシステムにおけるUnix timestampの最大値は何か。限界値、オーバーフロー時期、コードの将来対策について解説します。

Concept

2^31 - 1 / 2^63 - 1

詳細な説明

Unix timestampの最大値は、格納に使用される整数のサイズに依存します。32ビットシステムでは、符号付き整数の最大値は2,147,483,647(2^31 - 1)であり、2038年1月19日 03:14:07 UTCに相当します。64ビットシステムでは、最大値は9,223,372,036,854,775,807(2^63 - 1)であり、約2920億年先に相当します。太陽が燃え尽きたずっと後のことです。

ストレージ型ごとの最大値:

符号付き32ビット:    2,147,483,647       → 2038-01-19 03:14:07 UTC
符号なし32ビット:    4,294,967,295       → 2106-02-07 06:28:15 UTC
符号付き64ビット:    9,223,372,036,854,775,807 → 約2920億年後

ミリ秒timestampは範囲を縮小する:

秒の代わりにミリ秒を格納すると、64ビット整数の使用可能範囲は1000分の1になりますが、それでも約2億9200万年であり、すべての実用目的で事実上無限です。ただし、32ビット整数の場合、ミリ秒timestampはわずか24.8日でオーバーフローするため、32ビット幅では完全に実用的ではありません。

言語ごとの最大値:

JavaScript:  Number.MAX_SAFE_INTEGER = 2^53 - 1 (ms)
             → epochから約285,616年
Python:      任意精度整数、制限なし
Java:        long = 2^63 - 1 (Instantではms)
             → 約2億9200万年
Go:          int64, 内部的にナノ秒
             → epochから約292年(ナノ秒)、無制限(秒)

JavaScriptの特殊な状況: JavaScriptは数値に64ビット浮動小数点を使用します。最大安全整数(Number.MAX_SAFE_INTEGER = 9,007,199,254,740,991)は、ミリ秒timestampが約285,000年間安全であることを意味します。それ以降は精度の損失が発生します。実際にはこれは懸念事項ではありません。

データベースの制限:

MySQLのTIMESTAMP型は2038年が上限です。PostgreSQLのtimestamptzは西暦294,276年までサポートします。MongoDBはtimestampを64ビット値で保存します。ストレージを選択する際は、常にサポートされる最大日付を確認してください。特にサブスクリプションの有効期限や債券の満期日など、将来の日付を格納するレコードがある場合は注意が必要です。

将来に備えるために: 常に64ビットtimestampを使用してください。インフラにまだ32ビットコンポーネントがある場合は、2038年までに監査とアップグレードを行いましょう。

ユースケース

数十年先の債券満期日や保険契約の有効期限を格納する金融アプリケーションは、timestampのストレージが2038年をはるかに超える日付を表現できることを検証する必要があります。

Try It — Timestamp Converter

フルツールを開く