← 記事一覧

Epoch コンバーターの間違い:誤った Unix タイムスタンプ変換を避ける

Epoch コンバーターのバグの多くは計算ではなく、単位、タイムゾーン、そして入力に持ち込む思い込みにあります。これは、1970 年の日付や 1 時間ずれのバグを生む変換ミスのフィールドガイドで、それぞれを見抜く 1 つの検証手順とともに示します。

誤った日付を生む 7 つの間違い

Epoch コンバーターは単純な算術を行うだけなので、出力が誤っているとき原因はほとんど計算ではなく入力です。タイムスタンプには、それが秒かミリ秒か、UTC かローカルか、どれだけの精度かを示すラベルが付いておらず、誤変換はすべてそのいずれかを取り違えることから生じます。最も手早い手がかりは得られた年です。1970 年付近や数千年先の日付は単位の取り違え、正しいが時間がきりのよい時間数だけずれている日付はタイムゾーンのミスです。下の表がフィールドガイドで、続くセクションでは単位とタイムゾーンの間違いを詳しく説明し、変換をコードで検証する方法を示します。

間違い見える症状原因対処
秒をミリ秒として読む日付が 1970 年になるJS の Date と Date.now() は ms を期待。10 桁の秒を渡した秒を 1000 倍する
ミリ秒を秒として読む日付が数千年先になる13 桁の値を秒関数に渡したまず 1000 で割る
UTC をローカル時刻として表示日は正しいが時計がオフセット分ずれるコンバーターが既定で別のタイムゾーンを選んだコンバーターを UTC に切り替える
ローカル時刻をオフセットなしでコピー別マシンで数時間ずれるゾーンなしで壁時計時刻を保存したUTC とタイムゾーンを併せて保存する
夏時間で曖昧な壁時計時刻切り替え付近でちょうど 1 時間ずれる二度起きるか一度も起きないローカル時刻UTC から変換し、IANA ゾーンを固定する
マイクロ/ナノ秒を秒として読む日付が遠い未来になる(16 または 19 桁)データベースやトレーシングの µs または ns 値1,000,000(µs)または 1,000,000,000(ns)で割る
表示された精度を信用するサブ秒部分が黙って切り捨てられるコンバーターがミリ秒を切り捨てた対象 API が文書化する単位を確認する

Epoch コンバーターがすること

Epoch コンバーターは数値タイムスタンプを読みやすい日付に変え、人間の日付を Epoch タイムスタンプへ戻します。優れたものは Unix 秒、Unix ミリ秒、UTC 出力、ローカルタイムゾーン出力、ISO 8601 文字列を扱い、コードやデータベース、API リクエストに値をコピーする前に単位を明確にします。Epoch コンバーター、Unix 時間コンバーター、Unix タイムスタンプコンバーター、Unix エポック計算機はすべて同じ仕事を表します。1970 年 1 月 1 日 UTC からの秒(またはミリ秒)のカウントと、人間が読める日付の間を翻訳することです。コンバーターが問題であることはまれで、たいてい問題は入力です。

単位の間違い:秒、ミリ秒、マイクロ、ナノ

最も多い変換エラーは単位の取り違えで、特徴があります。日付が 1970 年、または数千年先になるのです。JavaScript で最も頻発します。Date コンストラクタと Date.now() がともにミリ秒で動く一方、ほとんどの API、データベース、Unix の date コマンドは秒で動くからです。10 桁の秒値を 1000 倍せずに new Date() に渡すと、53 年早く着地します。逆に、13 桁のミリ秒を秒関数に与えると、日付は遠い未来へ飛びます。高精度のソースはこれを悪化させます。データベースはしばしば 16 桁のマイクロ秒、トレーシングシステムは 19 桁のナノ秒を出力し、どちらも誤った千年紀にデコードされるまでは有効な Unix 値に見えます。

  • 10 桁 → 秒(例:1700000000);13 → ミリ秒;16 → マイクロ秒;19 → ナノ秒
  • JavaScript:new Date(seconds * 1000)、または new Date(ms) を直接
  • マイクロ秒 → 変換前に 1,000,000 で割る;ナノ秒 → 1,000,000,000 で割る
  • 妥当性チェック:結果は現在の 10 年代の信じられる日付であるべき

タイムゾーンの間違い:UTC vs ローカルと夏時間

単位が正しくなると、残るエラーはタイムゾーンエラーで、これも特徴を共有します。日付は正しいのに時計が整数時間だけずれるのです。Unix タイムスタンプは固有のタイムゾーンを持たない単一の瞬間で、オフセットは瞬間を整形するときにのみ適用されます。したがって、異なるタイムゾーンに設定した 2 つのコンバーターは同じ数値に対して異なる時計時刻を表示します。どちらも誤りではなく、異なるローカルの見方を示しているだけです。落とし穴は、どのゾーン由来かを記録せずにローカルの壁時計時刻をコピーすること、または夏時間の切り替えに当たる時刻を変換することです。そこではローカル時刻が二度起きるか、まったく起きないことがあります。結果がちょうど 1 時間ずれているときは、コンバーターより先に夏時間を疑ってください。

  • 値は UTC で比較し、ローカルタイムゾーンは表示する瞬間にのみ適用する
  • ローカル時刻は、その IANA ゾーンまたは UTC オフセットを併せて保存せずに保存しない
  • 夏時間の切り替え付近では、曖昧なローカル時刻ではなく UTC から瞬間を導く

まず方向を選ぶ

ほとんどのタイムスタンプ作業は 2 つの方向のいずれかです。Epoch から日付か、日付から Epoch です。方向を先に決めることで、誤ったテストデータや壊れた API ペイロードの最も多い原因——正しい値を誤った向きに変換すること——を防げます。

  • Epoch から日付:1700000000 を貼り付けて UTC またはローカルの日付を読む
  • 日付から Epoch:2026-01-01 00:00:00 UTC を選び 1767225600 を得る
  • 結果をコピーする前に、対象が秒かミリ秒のどちらを期待するか確認する

変換値をコピーする前に確認すること

コンバーターは入力が曖昧でない範囲でしか正しくなれません。タイムスタンプをテスト、cron ジョブ、マイグレーション、API リクエストにコピーする前に、単位、タイムゾーン、期待される精度を確認してください。最も手早い妥当性チェックは得られた年です。1970 年付近や遠い未来の日付は、ほぼ常にコンバーターの誤りではなく単位の取り違えを示します。

  • 受け取り側のシステムは秒とミリ秒のどちらを期待するか?
  • 表示された日付は UTC かローカル時刻か?
  • そのタイムスタンプは瞬間を表すのか、ローカルの暦日を表すのか?
  • データベース列はネイティブの datetime、Unix 秒、Unix ミリ秒のどれを保存するか?
  • 結果は 1970 年付近か遠い未来か。たいてい単位の取り違えを示す。

変換をコードで検証する

変換値が重要なとき——マイグレーション、課金の境界、cron スケジュール——では、単一のツールを信用しないでください。同じ瞬間を自分のランタイムで再導出し、両者が UTC で一致することを確認します。次の各行は Z 接尾辞付きの曖昧でない ISO 8601 文字列を出力するので、比較すべきローカルタイムゾーンの当て推量はありません。

  • JavaScript: new Date(1700000000 * 1000).toISOString() // '2023-11-14T22:13:20.000Z'
  • Python: datetime.fromtimestamp(1700000000, tz=timezone.utc).isoformat()
  • Shell (GNU): date -u -d @1700000000 +'%Y-%m-%dT%H:%M:%SZ'
  • ツールと自分のランタイムが食い違うなら、疑うべきは入力の単位かタイムゾーンであり、コンバーターではない

実例:1 つの瞬間、3 つの表現

瞬間 2026-01-01 00:00:00 UTC を取り上げます。Unix 秒では 1767225600、Unix ミリ秒では 1767225600000、ISO 8601 では 2026-01-01T00:00:00Z です。3 つとも同じ瞬間を表し、形式と単位だけが異なります。瞬間は固有のタイムゾーンを決して持ちません。ニューヨークでは同じ値が 2025-12-31 19:00:00 と表示されます。オフセットは表示時に適用されるもので、数値に保存されないからです。

関連記事

FAQ

変換した日付がなぜ 1970 年になるのですか?
ほぼ常に、秒がミリ秒として読まれたためです。JavaScript の Date と Date.now() はミリ秒を使うため、10 桁の秒値を渡すと 1970 年 1 月になります。まず秒を 1000 倍してください。
変換した時刻がちょうど 1 時間ずれるのはなぜですか?
それは計算ミスではなく、タイムゾーンまたは夏時間のミスです。コンバーターが別のタイムゾーンを適用したか、ローカル時刻が夏時間の切り替えに当たったのです。コンバーターを UTC に切り替えて正準の瞬間を確認し、その後に本当に必要なゾーンを適用してください。
コピーするのに最適な Epoch コンバーターの形式は?
コードには、対象 API が文書化しているものに応じて Unix 秒またはミリ秒をコピーします。人間向けには、瞬間が曖昧にならないよう Z または明示的なタイムゾーンオフセット付きの ISO 8601 をコピーします。
Epoch コンバーターは Unix 時間コンバーターと同じですか?
ほとんどの開発者の検索では、はい。Epoch コンバーター、Unix 時間コンバーター、Unix タイムスタンプコンバーター、Unix エポック計算機はすべて、Unix エポックタイムスタンプと読みやすい日付の間で変換します。
Epoch コンバーターによってローカル時刻が異なって表示されるのはなぜですか?
異なるタイムゾーンを適用しているからです。基盤となる UTC の瞬間は同一で、ローカル表示だけが変わります。コンバーターを UTC に切り替えて正準の値を比較してください。
自分の数値が秒かミリ秒かをどう見分けますか?
桁数を数えます。現代の 10 桁の値は Unix 秒、13 桁の値は Unix ミリ秒です。10 桁の値が JavaScript で 1970 年付近になるなら、ミリ秒として扱われており、1000 倍が必要です。