誤った日付を生む 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 倍が必要です。