負のUnixタイムスタンプとは?
1970年1月1日以前の日付を表します。例えば-86400は1969年12月31日を意味します。JavaScriptのDateオブジェクトも負のタイムスタンプを正しく処理できます。
Unixタイムスタンプ↔日時変換
Unixオペレーティングシステムが1969-1970年に開発された際、開発者が利便性のために1970年1月1日を基準点として選択しました。当時のコンピュータで扱いやすい値でした。
1970年1月1日以前の日付を表します。例えば-86400は1969年12月31日を意味します。JavaScriptのDateオブジェクトも負のタイムスタンプを正しく処理できます。
Date.now()でミリ秒タイムスタンプを取得でき、Math.floor(Date.now()/1000)で秒タイムスタンプを得られます。new Date().getTime()もDate.now()と同じ値を返します。
Unixタイムスタンプはコンピュータが時刻を保存する普遍的な方法で、1970年1月1日UTC(Unix epoch)からの経過秒数を単純な整数で表します。オペレーティングシステム、データベース、APIで日時を扱う標準的な仕組みです。タイムゾーンに依存しないため、国際的なシステムでも一貫性が保てます。
10桁は秒単位(例: 1700000000)、13桁はミリ秒単位(例: 1700000000000)です。JavaScriptのDate.now()はミリ秒を返し、Unix/Linuxのシステムコールは秒を使用します。APIから受け取る値の桁数を確認して単位を判断しましょう。
タイムスタンプは単純な整数なので比較・ソート・差分計算が容易です。日付文字列(YYYY-MM-DDなど)は形式やタイムゾーンの混乱を招きますが、タイムスタンプは常にUTCを基準にした明確な値です。ストレージ効率も高く、データベースのインデックス最適化にも有利です。
Unixタイムスタンプは常にUTC(協定世界時)を基準にしています。日本はUTC+9(JST)なので、表示時に9時間を加算してローカル時刻に変換します。保存はUTCで行い、表示時のみローカル変換することが国際開発のベストプラクティスです。
32ビット符号付き整数で保存されたUnixタイムスタンプは2038年1月19日03:14:07 UTCにオーバーフローします。これをY2K38問題またはUnix Millennium Bugと呼びます。64ビットシステムでは問題ありませんが、組み込みシステムや古いレガシーシステムでは依然リスクがあります。