Unixタイムスタンプって何?なぜ気にするべき?
データベース内のあの巨大な数字はランダムじゃありません。意味とその扱い方がこちら。
APIレスポンスをデバッグしています。created_at という値が 1704067200 のフィールドがあります。何日ですか?
それはUnixタイムスタンプです。1970年1月1日からの秒数です。そして理解すると、どこにでも見かけます。
なぜ1970年?
Unixは1960年代後半に開発されていました。設計者は時間計算の開始点が必要でした。1970年1月1日は実用的に十分最近で、ほとんどのコンピューティング歴史をカバーするのに十分早かった。
その瞬間——1970年1月1日UTC午前0時——はUnixエポックと呼ばれます。
なぜ日付じゃなく秒?
日付は複雑です。タイムゾーン、サマータイム、うるう年、月の長さの変動。「2024年3月15日午後3時EST」は多くのパースが必要。
タイムスタンプはただの数字。1710522000。保存しやすい、比較しやすい、数学しやすい。
どのイベントが最初に起きたか知りたい?2つの数字を比較。何かにかかった時間を知りたい?タイムスタンプを引く。24時間追加したい?86400を足す。
タイムゾーンの利点
賢い部分がこちら:タイムスタンプは常にUTC。
東京とニューヨークの誰かが両方とも同じ瞬間を記録すると、同じタイムスタンプを得ます。表示は異なるかもしれません——一方は午前9時を見、もう一方は午後7時を見る——でも基礎となる数字は同一。
これが分散システムを可能にします。データベース、API、ログファイル——サーバーがどこにあろうとすべて同じ基準点を使います。
ミリ秒 vs 秒
JavaScriptはエポックからのミリ秒を使います。ほとんどの他の言語は秒を使います。
1704067200(秒)= 2024年1月1日、00:00:00 UTC
1704067200000(ミリ秒)= 同じ瞬間
タイムスタンプがあまりに大きく見えるなら、おそらくミリ秒。1000で割りましょう。
タイムスタンプを素早く読む
暗算を調整するためのいくつかの基準点:
- 1000000000(10億)= 2001年9月9日
- 1600000000 = 2020年9月
- 1700000000 = 2023年11月
- 1800000000 = 2027年1月
現在のタイムスタンプは17億の範囲。17で始まるものを見たら、おそらく最近のタイムスタンプ。
よくある操作
現在のタイムスタンプ:
Math.floor(Date.now() / 1000) // JavaScript
import time; int(time.time()) # Python
タイムスタンプを日付に:
new Date(1704067200 * 1000) // JavaScriptはミリ秒が必要
日付をタイムスタンプに:
Math.floor(new Date('2024-01-01').getTime() / 1000)
2038年問題
Unixタイムスタンプは元々32ビット符号付き整数として保存されました。最大値は?2,147,483,647。
それは2038年1月19日、03:14:07 UTC。
その瞬間の後、32ビットシステムはオーバーフローします。タイムスタンプのY2K。
ほとんどの現代システムは今64ビット整数を使い、数十億年オーバーフローしません。でもレガシーシステムは存在します。古いコードを扱っているなら、チェックする価値があります。
タイムスタンプが変になる時
負のタイムスタンプ。 1970年より前の日付は負の数。-86400 は1969年12月31日。
うるう秒。 UTCは時々、地球の自転と同期を保つために秒を追加。ほとんどのシステムはこれを無視。時々カオスを引き起こします。
クロックドリフト。 サーバーの時計は不一致かもしれません。異なるマシンからの2つのタイムスタンプは、時計が同期していなければ直接比較できないかもしれません。
タイムスタンプは見始めるとどこにでもあります。APIレスポンス、データベースレコード、ログファイル、クッキー。理解すればデバッグが速くなり、時間関連コードが謎でなくなります。