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 年として表示される原因になります。