Unixタイムスタンプ変換
Unixタイムスタンプを読みやすい日時に、またその逆に変換。任意のタイムゾーンと現在時刻に対応。
1行に1つのタイムスタンプまたは日付を、最大500行まで入力できます。
このコードをDiscordのメッセージに貼り付けると、読む人それぞれのタイムゾーンと言語で表示されます。
このタイムスタンプを自分のコードで変換します。
UNIXタイムスタンプ変換ツール - エポックと日付の相互変換
ログもデータベースもAPIも時刻を数値で保存しますが、人間は日付として読みます。この無料のUNIXタイムスタンプ変換ツールは、その隔たりを双方向で埋めます。エポック値を貼り付ければ読める日付になり、日付と時刻を指定すればコードが求める数値が得られます。現在のタイムスタンプは常に上部に表示され、すぐコピーできます。
計算はすべてブラウザー内で行われるため、本番ログや社内システムの値をどこにも送信せずに変換できます。
UNIXタイムスタンプとは
UNIXタイムスタンプは、エポック時間やPOSIX時間とも呼ばれ、1970年1月1日00:00:00 UTCからの経過秒数を表します。タイムゾーンも暦も書式も持たない単一の整数なので、曖昧さがなく、並べ替えも比較も差分計算も簡単です。この単純さゆえに、ほぼすべてのログファイル、データベースの列、APIレスポンスが内部でこの形式を使っており、開発者は週に何度も読める形へ戻す必要に迫られます。
秒かミリ秒か、桁数を数えましょう
これが最も多い混乱の原因です。秒単位のタイムスタンプは現在10桁で、同じ瞬間をミリ秒で表すと13桁になります。UNIX、PHP、Python、ほとんどのデータベースは秒で扱い、JavaScriptのDate.now()やJava、多くのログ基盤はミリ秒で扱います。変換結果が1970年になったら、秒を期待するツールにミリ秒を渡しています。逆に数万年先の日付になったなら、その反対のことをしています。この変換ツールは桁数を自動で数えます。11桁までは秒、14桁まではミリ秒、17桁まではマイクロ秒、それより長ければナノ秒として読み、結果の下の行にどの単位とみなしたかが表示されます。判定が外れたとき(たとえば1970年代初めのミリ秒の値)は、単位メニューで自動判定の代わりに単位を自分で選んでください。
タイムスタンプを変換する手順
- エポック値を読むには、タイムスタンプ欄に貼り付けて変換をクリックします。
- 逆方向では、日付と時刻を入力し、日付側の変換をクリックします。
- 現在時刻を使用を押すと、現在時刻が入力欄に入ります。
- テストやトークン、クエリ用の値が必要なときは、上部に表示されているタイムスタンプをコピーします。
- セレクターでタイムゾーンを選ぶと、その地域の時刻で日付を表示したり、その地域の現地時刻として日付を入力したりできます。
- 多くの値をまとめて変換するには、一括タブを開き、タイムスタンプや日付を1行に1つずつ最大500件貼り付けてすべて変換をクリックします。自動判定では単位が行ごとに判定され、CSVでコピーで表をスプレッドシートに渡せます。
見覚えのあるタイムスタンプ
| 値 | 時点 | 意味 |
|---|---|---|
0 | 1970年1月1日 00:00:00 UTC | エポックそのもの。1970年と表示されたら空値やNULLの可能性が高い |
1000000000 | 2001年9月9日 | 最初の10桁のタイムスタンプ |
1700000000 | 2023年11月14日 | 覚えやすい現代の基準点 |
2147483647 | 2038年1月19日 | 符号付き32ビット整数が保持できる最大値 |
| 負の値 | 1970年より前 | 有効ですが、一部のライブラリやデータベースでは扱えません |
エポック時間が登場する場所
- JWTの
exp・iat・nbfクレーム。中身はJWTデコーダーで確認できます。 - 各行がエポック値で始まるサーバーログやアプリケーションログ。
- 日付型ではなく整数で保存された
created_atのような列。 - キャッシュの有効期限、レート制限のウィンドウ、定期実行ジョブのトリガー。
- リプレイ攻撃を防ぐためにタイムスタンプを含むWebhookのペイロードやAPIの署名。
- OSが報告するファイルの更新日時。
タイムゾーンと、日付がずれて見える理由
タイムスタンプにタイムゾーンはありません。絶対的な一点を指す値です。表示される日付は、その一点を何らかのタイムゾーンで描画した結果なので、同じ数値でもテヘラン、ベルリン、東京では異なる現地時刻として読めます。値が数時間ずれて見えるとき、間違っているのはほぼ常に数値ではなく表示タイムゾーンです。保存と送信はUTCで行い、人に見せるときだけ現地時刻へ変換し、ログとスクリーンショットを突き合わせるときはオフセットを意識してください。
知っておきたい落とし穴
- 2038年問題。符号付き32ビットの時刻フィールドを使うシステムは2038年1月19日にあふれます。長期を扱うなら64ビットの時刻型を使ってください。
- サマータイム。現地の壁時計時刻は同じ時刻が2回来たり1時間飛んだりしますが、エポック値には起こりません。
- うるう秒。UNIX時間はうるう秒を無視するため、物理的な経過秒数の正確な数え上げではありません。
- 文字列と整数。文字列で保存したタイムスタンプは辞書順に並ぶため、桁数が変わった瞬間に順序が崩れます。
- 丸め。ミリ秒を切り捨てて秒にすると、イベントが1秒前に移ることがあります。処理全体で同じ方法に統一してください。
Discordのタイムスタンプ
Unixタイムスタンプを <t:1700000000:F> の形式で書くと、Discordはそれを各自のタイムゾーンに合わせた動的な日時として表示します。スタイル文字ごとに表示形式が変わります:t 短い時刻、T 中程度の時刻(秒付き)、d 短い日付、D 長い日付、f 長い日付と短い時刻(既定)、F 曜日付きの完全な日付と短い時刻、s 短い日付と短い時刻、S 短い日付と中程度の時刻、R は「3時間後」のような相対表記。読む人がそれぞれ自分のローカル時刻で見られるのが要点です。
変換ツールのDiscordタブを使えば、このコードを自動で作れます。日付と時刻を選ぶか現在時刻を使用を押すと、表にすべてのスタイルが並び、コード列の完成したコード、コピーボタン、表示例のプレビューが表示されます。ただしこのタブは時刻を端末のタイムゾーンで読み、タイムゾーンメニューは使わないため、正しいのはイベントが自分の端末の時刻どおりの場合だけです。別の地域で予定されたイベントなら、タイムゾーンメニューでその地域を選び、日付 → タイムスタンプに日付と時刻を入力して変換を押し、秒の値を自分で<t:...:F>に入れます。一括タブは選択したタイムゾーン列をメニューのタイムゾーンで表示しますが、オフセットなしで入力した日付はやはり端末のタイムゾーンで読みます。予定表を作るときは、2026-10-01T18:00-04:00のように各行にオフセットを書いてください。
コード・SQL・Excelでタイムスタンプを変換する
変換ツールのコードタブは、タイムスタンプ欄の値(空欄なら現在時刻)について、この変換をJavaScript、Python、PHP、SQL、Go、Java、C#、Bashで書き出し、コピー用のボタンも付いています。下の表は手元に置いておくための簡易版です。
| 場所 | 現在のタイムスタンプ | タイムスタンプ→日時 |
|---|---|---|
| JavaScript | Math.floor(Date.now() / 1000) | new Date(ts * 1000) |
| Python | int(time.time()) | datetime.fromtimestamp(ts, tz=timezone.utc) |
| PHP | time() | date('Y-m-d H:i:s', $ts) |
| MySQL | UNIX_TIMESTAMP() | FROM_UNIXTIME(ts) |
| PostgreSQL | EXTRACT(EPOCH FROM now()) | to_timestamp(ts) |
| Linuxシェル | date +%s | date -d @1700000000 |
| Excel / Google スプレッドシート | - | =A1/86400 + DATE(1970,1,1) と入力し、セルの表示形式を日付にする(UTC。ミリ秒なら 86400000 で割る。JSTにするなら + TIME(9,0,0) を足す) |
関連ツール
時刻の値は単独で現れることが少ないものです。トークンの有効期限はJWTデコーダーで確認し、ログのペイロードはJSON整形ツールで読みやすくし、テキスト中の日付パターンは正規表現テスターで探し、リクエストIDはUUID生成ツールで作成できます。定期実行ジョブが次にいつ動くかを確かめるには、cron式チェッカーを使ってください。