JavaScript Date.now():Unix タイムスタンプの取得と変換
JavaScript Date.now() に焦点を当てたガイド:現在の Unix タイムスタンプの取得、秒とミリ秒の変換、タイムスタンプの Date オブジェクト化、Intl での整形、よくある解析の落とし穴の回避。
JavaScript が内部で時間をどう保存するか
すべての JavaScript Date は内部的に、Unix エポック(1970 年 1 月 1 日 00:00:00 UTC)からのミリ秒を表す単一の 64 ビット浮動小数点です。この数値が Date.getTime() と Date.now() が返すものです。Date の内部にタイムゾーンは保存されません。常に UTC ミリ秒のカウントです。タイムゾーン情報は日付を表示用に整形するときだけ問題になり、だからこそ同じ Date オブジェクトがロサンゼルスでは月曜の夜、東京では火曜の朝に見えることがあります。この記事は Date.now() とタイムスタンプの変換に焦点を当てます。JavaScript のあらゆるタイムスタンプ作業のより広い解説は、下のリンク先の完全リファレンスガイドを参照してください。
現在の Unix タイムスタンプを取得する
ミリ秒には Date.now()、秒には Math.floor(Date.now() / 1000) を使います。どちらも広くサポートされ、インポートは不要です。重要な命名習慣は、変数名に単位を含めることです:createdAtMs・expiresAtSeconds・unixSeconds。単位付きの名前は、将来の API 利用者が単位なしのタイムスタンプフィールドの意味を推測するのを防ぎます。
- Date.now() → 1700000000000 (milliseconds, 13 digits)
- Math.floor(Date.now() / 1000) → 1700000000 (seconds, 10 digits)
- +new Date() → same as Date.now() via unary coercion
- new Date().getTime() → same result, slightly more verbose
Date.now() vs performance.now()
Date.now() は壁時計のタイムスタンプ用です:ログ・API ペイロード・データベースフィールド・キャッシュの失効、そして実際の暦時刻に合わせる必要があるすべてです。performance.now() は現在のページまたはプロセス内の経過時間の計測用です。単調で高精度ですが、Unix タイムスタンプではなく、追加の基準点なしに実際の日付へ変換できません。
- 値を保存・API へ送信・日付として表示する場合は Date.now() を使う
- レンダリング・解析・リクエストにかかった時間を計測するときは performance.now() を使う
- performance.now() をイベント時刻としてデータベースに保存しない
- セキュリティに敏感な計時のために 2 つの Date.now() 値を引き算しない;システムクロックの変更が影響しうる
タイムスタンプを Date に変換する
Date コンストラクターはミリ秒を受け取ります。タイムスタンプが秒(10 桁)なら、渡す前に 1000 を掛けてください。これを忘れるのが JavaScript で最も一般的なタイムスタンプの誤りです。手早い確認は桁数です:現在の Unix 秒は 10 桁、現在の Unix ミリ秒は 13 桁で、Date コンストラクター呼び出しは 13 桁のミリ秒形式を受け取るべきです。
- new Date(1700000000 * 1000) → Tue Nov 14 2023 22:13:20 UTC ✓ correct
- new Date(1700000000) → Tue Jan 20 1970 16:13:20 UTC ✗ missing × 1000
- new Date(1700000000 * 1000).toISOString() → '2023-11-14T22:13:20.000Z'
- new Date(1700000000 * 1000).toUTCString() → 'Tue, 14 Nov 2023 22:13:20 GMT'
Intl でタイムゾーン対応の整形
ロケールとタイムゾーンを考慮した出力には Intl.DateTimeFormat を使います。夏時間を自動的に扱い、外部ライブラリは不要です。ダッシュボード・管理ツール・ステータスページ・ユーザー向けタイムスタンプに最も安全な組み込みの手段です。ロケールと IANA タイムゾーンの両方を明示的に選べるからです。
- new Intl.DateTimeFormat('en-US', { timeZone: 'America/New_York', dateStyle: 'full', timeStyle: 'long' }).format(date)
- date.toLocaleString('en-GB', { timeZone: 'Europe/London', hour12: false })
- date.toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' })
- new Intl.DateTimeFormat('en-CA', { timeZone: tz }).formatToParts(date) → array of {type, value} for custom layouts
日付文字列を安全に解析する
解析は JavaScript が驚かせてくるところです。明示的な Z やオフセット付きの ISO 文字列は、1 つの正確な瞬間を特定するため安全です。素の日付や非公式な文字列は読みやすいですが、しばしばブラウザの規則やランタイムのタイムゾーンに依存します。API 契約には、タイムゾーン付きの ISO 8601 文字列か、単位をフィールド名に書き込んだ数値の Unix タイムスタンプを優先してください。
- Safe: new Date('2026-05-19T14:30:00Z') — explicit UTC
- Safe: new Date('2026-05-19T10:30:00-04:00') — explicit offset
- Risky: new Date('05/19/2026') — locale-dependent and ambiguous
- Risky: new Date('2026-05-19 10:30') — not a strict ISO timestamp in all runtimes
JavaScript でよくあるタイムスタンプの誤り
- new Date(1700000000 * 1000) ではなく new Date(1700000000) — 2023 年ではなく 1970 年に着地
- getMonth() は 1–12 ではなく 0–11 を返す — 表示時は常に date.getMonth() + 1 を使う
- new Date('2024-01-01') は UTC 深夜として解析され、new Date('2024/01/01') はローカル深夜として解析される
- 「翌日」に 86400000 ms を足すと夏時間の切り替えで壊れる — 代わりに setDate(d.getDate() + 1) を使う
- Date オブジェクトを === で比較すると常に失敗する — 代わりに .getTime() 値を比較する
推奨される JavaScript タイムスタンプ チェックリスト
最も単純な本番パターンは、1 つの正規の瞬間を保存し、端でのみ整形することです。タイムスタンプは UTC で保持し、名前に単位を含め、UI またはレポート層でのみ人間が読めるタイムゾーンに変換します。
- ブラウザだけの状態と JavaScript の Date 構築には Unix ミリ秒を使う
- Unix 時間を秒で文書化する API を呼ぶときは Unix 秒を使う
- 人がペイロードを確認しうる場合は Z または明示的なオフセット付きの ISO 8601 を使う
- 表示には明示的な timeZone 付きの Intl.DateTimeFormat を使う
- ローカルの暦日が重要な場合は夏時間の境界周辺のテストを追加する
JavaScript タイムスタンプ FAQ
- Date.now() は秒を返す?ミリ秒を返す?
- Date.now() は 1970 年 1 月 1 日 00:00:00 UTC からのミリ秒を返します。API が Unix 秒を期待するときは 1000 で割り、Math.floor() を使ってください。
- なぜ new Date(1700000000) は 1970 年を表示する?
- Date コンストラクターはミリ秒を期待します。1700000000 は秒のタイムスタンプなので、JavaScript はエポック後わずか 17 億ミリ秒として読みます。new Date(1700000000 * 1000) を使ってください。
- JavaScript の Date はタイムゾーンを保存する?
- いいえ。Date は UTC ミリ秒のカウントを保存します。タイムゾーンは toString()・toLocaleString()・Intl.DateTimeFormat のようなメソッドで整形するときだけ適用されます。
- Unix タイムスタンプを JavaScript の Date に変換するには?
- コンストラクターにミリ秒を渡します:10 桁の秒値には new Date(seconds * 1000)、13 桁のミリ秒値には new Date(ms)。× 1000 を忘れると、2023 年のタイムスタンプが 1970 年として表示される原因になります。