JavaScript で Unix タイムスタンプを扱う
JavaScript で Unix タイムスタンプを扱うために必要なすべて — 現在時刻の取得、タイムスタンプからの Date 生成、任意のタイムゾーン向けの整形、よくある誤りの回避。
現在の Unix タイムスタンプを取得
JavaScript には、現在時刻を数値タイムスタンプとして得る同等の方法がいくつかあります。いずれも Unix エポックからのミリ秒数を返します。
- Date.now() → the fastest and most readable — 1700000000000 (milliseconds)
- Math.floor(Date.now() / 1000) → Unix timestamp in seconds — 1700000000
- +new Date() → same as Date.now(), using the unary plus operator
- new Date().getTime() → explicit method call, same result as Date.now()
Unix タイムスタンプから Date オブジェクトを作成
Date コンストラクターはエポックからのミリ秒を受け取ります。秒単位のタイムスタンプは、コンストラクターに渡す前に必ず 1000 を掛けてください。
- new Date(1700000000 * 1000) → from seconds (most common case)
- new Date(1700000000000) → from milliseconds (JavaScript APIs, Java)
- new Date(Date.now()) → current time as a Date object
- new Date(0) → the Unix epoch: January 1, 1970 00:00:00 UTC
日付の整形 — 組み込みの文字列メソッド
Date オブジェクトには複数の組み込み文字列変換メソッドがあり、それぞれ異なる形式を生成します。
- .toISOString() → '2023-11-15T06:13:20.000Z' — ISO 8601, always UTC, machine-readable
- .toUTCString() → 'Wed, 15 Nov 2023 06:13:20 GMT' — RFC 7231, human-readable UTC
- .toString() → local timezone string with full zone name
- .toLocaleString() → locale-aware format in the user's local timezone
Intl.DateTimeFormat によるタイムゾーン対応の整形
外部ライブラリなしで一貫したタイムゾーン対応の日付整形を行うには、Intl.DateTimeFormat API を使います。すべての現代的なブラウザと Node.js 13+ で利用できます。
- new Intl.DateTimeFormat('en-US', { timeZone: 'America/New_York', dateStyle: 'full', timeStyle: 'long' }).format(date)
- date.toLocaleString('en-GB', { timeZone: 'Europe/London', hour12: false })
- new Intl.DateTimeFormat('zh-CN', { timeZone: 'Asia/Shanghai' }).format(date)
- new Intl.DateTimeFormat('en-CA', { timeZone: tz }).formatToParts(date) → array of {type, value} parts for custom layouts
日付文字列を Unix タイムスタンプに戻す
逆方向に進む(日付文字列から Unix タイムスタンプへ)には、Date.parse() を使うか、文字列を Date コンストラクターに渡します。
- new Date('2023-11-15T06:13:20Z').getTime() / 1000 → Unix seconds from ISO 8601 UTC
- new Date('2023-11-15T01:13:20-05:00').getTime() → Unix milliseconds from ISO with offset
- Date.parse('2023-11-15T06:13:20Z') → same as new Date(...).getTime()
- Always use ISO 8601 format with explicit timezone for predictable parsing
よくある落とし穴
JavaScript 開発者が日付とタイムスタンプで犯しやすい間違いは次のとおりです:
- new Date(1700000000) — × 1000 を忘れると 2023 年ではなく ~1970 年になる
- getMonth() は 1–12 ではなく 0–11 を返す — 表示時は必ず 1 を足す
- new Date('2024-01-01') は UTC 深夜、new Date('2024/01/01') はローカル深夜
- new Date(2024, 0, 1) = 1 月 1 日(コンストラクターでも月は 0 始まり)
- 86400000 ms を足して「明日」を得るとサマータイム境界で失敗しうる — 代わりに setDate(d.getDate() + 1) を使う
JavaScript の Unix タイムスタンプ FAQ
- JavaScript で秒単位の Unix タイムスタンプを得るには?
- Math.floor(Date.now() / 1000) を使います。Date.now() はミリ秒を返すので、1000 で割って切り捨てると整数の Unix 秒になります。
- なぜ Unix タイムスタンプを渡した new Date() が 1970 年になる?
- Date コンストラクターはミリ秒を期待します。10 桁の秒タイムスタンプは 1000 倍する必要があります:new Date(seconds * 1000)。
- 特定のタイムゾーンで JavaScript の日付を整形するには?
- 明示的な timeZone オプションを付けて Intl.DateTimeFormat を使います。例:new Intl.DateTimeFormat('en-US', { timeZone: 'America/New_York' })。サマータイムも自動適用され、外部ライブラリは不要です。