Unixタイムスタンプとは(開発者がそれを使う理由)

Unixタイムスタンプは、単一の整数です。1970年1月1日 00:00:00 UTCからの経過秒数を表します。この瞬間をUnix epoch(エポック)と呼び、それ以来、秒数はずっと途切れることなく数え続けられています。

現在のタイムスタンプはおおよそ 1,750,000,000 です。この数字だけで、どのコンピュータ、データベース、API でも、あなたが指す正確な時点が分かります。曖昧さはありません。

なぜ1970年?

Unix は 1960 年代後半、Bell Labs で開発されました。時間の固定基準点が必要になった時、エンジニアたちは 1970 年 1 月 1 日を選びました。新しい十年紀の始まり、わかりやすく、最近の過去だったため、保存する日付に負の数を使う必要がなかったのです。

これは原則的な選択というより、実用的な選択でした。そしてそのまま定着しました。

Unixタイムスタンプが解決する問題

人間が読める文字列として日付を表すと、あらゆる層で曖昧性が生じます。

  • フォーマットの違い: 03/04/25 は 3 月 4 日ですか、それとも 4 月 3 日ですか?1925 年ですか、2025 年ですか?
  • タイムゾーンの混乱: 「金曜日の午後3時」はロンドンと東京では異なる瞬間を指します
  • 地域による違い: 年-月-日と書く国もあれば、月-日-年と書く国もあります

Unixタイムスタンプはこれらすべてを回避します。1711929600 は、あなたがどこにいようが、どのフォーマットを好もうが、単一で曖昧さのない時点を表します。マシンは一致し、人間は変換できます。

秒、ミリ秒、マイクロ秒

元々の Unixタイムスタンプは単位です。しかし、システムによって異なる精度が使われます。

フォーマット単位
Unix (POSIX)1711929600
JavaScript Date.now()ミリ秒1711929600000
Python time.time()秒(浮動小数点)1711929600.123
データベースのタイムスタンプマイクロ秒の場合が多い1711929600000000

これはシステム間で作業する時の最も一般的なバグの原因の一つです。JavaScript のタイムスタンプを Python や Go の関数に直接渡すと、1,000 倍大きくなってしまいます。システム境界を越える時は、常に精度を確認してください。

Unixタイムスタンプの読み取りと書き込み

JavaScript / TypeScript

// 秒単位の現在のタイムスタンプ
Math.floor(Date.now() / 1000)

// ミリ秒単位の現在のタイムスタンプ
Date.now()

// タイムスタンプ(秒)を Date オブジェクトに変換
new Date(timestamp * 1000)

// Date をタイムスタンプ(秒)に変換
Math.floor(new Date('2024-04-01').getTime() / 1000)

Python

import time, datetime

# 現在のタイムスタンプ(浮動小数点)
time.time()

# datetime に変換
datetime.datetime.fromtimestamp(1711929600)

# datetime をタイムスタンプに変換
datetime.datetime(2024, 4, 1).timestamp()

SQL(PostgreSQL)

-- 現在のタイムスタンプ
EXTRACT(EPOCH FROM NOW())::int

-- タイムスタンプに変換
TO_TIMESTAMP(1711929600)

タイムゾーンはタイムスタンプ自体に影響しない

これは重要で、よく誤解されることです。

Unixタイムスタンプは常に UTC の時点を表します。表示する時は、ローカルタイムゾーンに変換します。保存する時は、UTC の値を保存します。タイムスタンプ自体はタイムゾーンに依存しません。

つまり:

  • 異なるタイムゾーンの 2 人のユーザーが「今」を保存しても、同じタイムスタンプが得られます
  • 表示する際、各ユーザーはそれぞれのローカル時間で見ます
  • データベースではオフセット調整は不要です。プレゼンテーション層のみで行います

2038年問題

32 ビット符号付き整数として保存された Unixタイムスタンプは、最大 2,147,483,647 秒まで数えられます。これは2038 年 1 月 19 日 03:14:07 UTC に相当します。その後、32 ビット カウンターは大きな負の数に折り返ります。

タイムスタンプを 32 ビット整数として保存しているシステムは、その日付で故障します。最新のシステムの多くは 64 ビット整数を使用し、オーバーフロー日を 292 億年に延ばしています。これは実用上、十分に遠い将来です。

組み込みシステム、レガシーデータベース、古い C コードで作業している場合は、タイムスタンプがどのように保存されているか確認する価値があります。

Unixタイムスタンプを使う時

次の場合は Unixタイムスタンプを使用してください:

  • データベースに日付を保存し、シンプルでソート可能な整数が欲しい
  • システム間や API を通じて日付を渡す
  • イベントを時系列で比較またはソートする
  • 期間を計算する(2 つのタイムスタンプを引き算するだけ)
  • キャッシュまたは有効期限ロジックを扱う(expires_at = now + 3600

次の場合は形式化された日付文字列を使用してください:

  • ユーザーに日付を表示する
  • 人間が読める形式でイベントをログに記録する
  • スプレッドシートや CSV エクスポートで作業する

クイック換算表

内容
1 分60
1 時間3,600
1 日86,400
1 週間604,800
30 日2,592,000
1 年(約)31,536,000

Unix Timestamp Converter は、任意のタイムスタンプを人間が読める日付に変換したり、日付を Unixタイムスタンプに変換したりします。

関連記事