秒かミリ秒か
Unixタイムスタンプは1970年1月1日0時UTCからの経過時間です。やっかいなのは、これを秒で数える環境とミリ秒で数える環境が混在していることです。
- 秒 — Unix系のコマンド、PostgreSQLやMySQLの時刻関数、JWTの
exp・iat、多くのREST API - ミリ秒 — JavaScriptの
Date.now()、JavaのSystem.currentTimeMillis()、多くのログ収集基盤
単位を取り違えると1970年1月のどこか(ミリ秒を秒として読んだ場合)か、西暦5万年あたり(秒をミリ秒として読んだ場合)に飛びます。このツールは値の大きさから単位を推測し、どちらとして読んだかを表示しますので、日付がおかしいときはまずその行を確認してください。
タイムゾーンの落とし穴
タイムスタンプ自体にタイムゾーンはありません。ある瞬間を指す数値がひとつあるだけで、タイムゾーンはそれを人が読む文字に直すときに付きます。だから同じ値が東京では午後4時、ロンドンでは午前7時に見えます。
不具合報告に「午後3時に失敗しました」とだけ書かれていても、どの地域の時刻か分かりません。ログにはタイムスタンプか、オフセット付きのISO 8601文字列を残し、人が読む時刻は表示するときにだけ組み立ててください。
2038年問題
タイムスタンプを32ビット符号付き整数に入れると、2038年1月19日にあふれます。その瞬間に値が負へ回り込み、日付が1901年になります。最近の言語やデータベースは64ビットですが、古い組み込み機器や昔のCコードを保守しているなら、格納幅を一度確認しておく価値があります。
負の値と0
負の値は1970年より前を指します。生年月日のような古い日付をこの形式で保存すると出てきますが、ライブラリによっては正しく扱えないものもあります。
0は1970年1月1日0時UTCです。実データにこの値が現れたら、たいていは本当の時刻ではなく、初期化されていないフィールドです。