ShibaHubShibaHub
開発者向け

Unixタイムスタンプとは?1970年から数える理由と「2038年問題」

Unixタイムスタンプの定義と秒・ミリ秒の違い、UTCとJSTの関係、2038年問題のオーバーフローの仕組みがわかります。

APIのレスポンスやログファイルで「1718000000」のような10桁前後の数字を見たことがあるかもしれません。これはUnixタイムスタンプ(Epoch time)と呼ばれる、日時を1つの数値で表す方法です。この記事ではUnixタイムスタンプの定義と、なぜ1970年から数えるのか、そして「2038年問題」と呼ばれる課題について解説します。

1. Unixタイムスタンプとは何か

Unixタイムスタンプ(Epoch timeとも呼ばれます)は、協定世界時(UTC)の1970年1月1日0時0分0秒を基準点(0)として、そこから何秒経過したかを表す数値です。「年・月・日・時・分・秒」という複雑な形式の代わりに、1つの整数だけで特定の瞬間を表せるため、プログラムでの日時の計算や比較がシンプルになります。

手元の日時をタイムスタンプに変換したり、タイムスタンプから日時を確認したい場合はタイムスタンプ変換ツールが便利です。

2. なぜ1970年1月1日が基準なのか

1970年1月1日という基準点は、何か特別な天文学的・歴史的な出来事に基づくものではなく、Unix OSが開発された時期に由来する取り決めです。Unixの開発が進められていた1960年代末から1970年代初頭にあたるタイミングで、扱いやすい基準点として1970年1月1日0時0分0秒(UTC)が採用され、それがそのまま広く使われる標準になりました。

この基準点よりも前の日時を表す場合は、タイムスタンプは負の数になります。多くのプログラミング言語やシステムが、1970年以降だけでなくそれ以前の日時もこの仕組みで扱えるように対応しています。

3. 秒単位とミリ秒単位の違いに注意

Unixタイムスタンプは元々「秒」単位で定義されていますが、プログラミング言語によっては「ミリ秒」単位(1000分の1秒)の値を返すことがあります。代表的な例がJavaScriptのDate.now()で、これは秒単位ではなくミリ秒単位の値を返します。

単位桁数の目安(2026年現在)代表的な例
秒単位10桁Unix系OSの多くのコマンド、Pythonのtimeモジュールのデフォルトなど
ミリ秒単位13桁JavaScriptのDate.now()、多くのWeb APIのタイムスタンプ

異なる単位の値を混同して計算すると、日時が1000倍ずれてしまうなどのバグにつながります。タイムスタンプを扱う際は、それが秒単位かミリ秒単位かを必ず確認することが重要です。

4. UTCとJST(日本標準時)の関係

Unixタイムスタンプ自体は世界共通の協定世界時(UTC)を基準にした「経過秒数」であり、タイムゾーンの情報を持っていません。同じタイムスタンプの値を「何月何日何時何分」という表示に変換する際に、どのタイムゾーンで表示するかによって見える日時が変わります。

日本標準時(JST)はUTCより9時間進んでいる(UTC+9)ため、UTCで「1月1日0時0分0秒」のタイムスタンプは、JSTで表示すると「1月1日9時0分0秒」になります。同じタイムスタンプの値でも、表示する場所のタイムゾーン設定によって見た目の日時が違う、という点を理解しておくと、日時のずれによる混乱を避けやすくなります。

5. 「2038年問題」とは

「2038年問題」とは、Unixタイムスタンプを32bitの符号付き整数で保持しているシステムにおいて、2038年1月19日3時14分7秒(UTC)にその数値が表現できる最大値を超え、オーバーフローしてしまう問題です。32bit符号付き整数で表せる範囲を超えると、内部的に値が負の数に折り返されてしまい、日時が1901年あたりに巻き戻って見えるなどの不具合が発生する可能性があります。

これは2000年問題(西暦の下2桁だけで年を管理していたために起きた問題)と似た構造の問題で、古い32bit環境やそれを前提に作られたソフトウェアでは注意が必要とされています。現在は64bit整数でタイムスタンプを扱うシステムが主流になっており、64bitであれば表現できる範囲が大幅に広がるため、2038年問題は実質的に回避できます。多くの主要なOSやプログラミング言語ではすでに64bitへの対応が進んでいますが、組み込み機器や古いシステムの一部には注意が必要なものも残っているとされています。

6. うるう秒との関係

地球の自転速度のわずかなずれを調整するために、不定期に「うるう秒」が挿入されることがあります。厳密にはうるう秒が挿入された日はその日の秒数が1秒増えることになりますが、多くのシステムで採用されているUnixタイムスタンプの仕組みでは、うるう秒を直接カウントせず、1日を常に86,400秒として扱うのが一般的です。

そのため、Unixタイムスタンプとうるう秒を含む正確な時刻との間には、ごくわずかなずれが生じることがありますが、日常的な用途やほとんどのアプリケーションでは、このずれが問題になることはほとんどありません。

まとめ

Unixタイムスタンプは、1970年1月1日0時0分0秒(UTC)を基準にした経過秒数で日時を表す仕組みで、プログラムでの日時の処理をシンプルにしてくれます。秒単位とミリ秒単位の違いやタイムゾーンの扱い、そして2038年問題のような桁あふれの課題があることも知っておくと、日時を扱う際のトラブルを避けやすくなります。実際の変換はタイムスタンプ変換ツールで手軽に試せます。

この記事に関連する計算ツール
コラムをもっと見る計算ツールの背景知識をわかりやすく解説見る
広告広告枠レスポンシブ / 728 × 90