JavaScript で Unix タイムスタンプを扱う
JavaScript で Unix タイムスタンプを扱うために必要なすべて——現在時刻の取得、タイムスタンプからの Date 生成、任意のタイムゾーン向けのフォーマット、よくある間違いの回避——コピペできるチートシートと詳細ガイドへのリンクを添えて。
JavaScript タイムスタンプ チートシート
JavaScript はミリ秒で動きます:Date.now() と Date コンストラクターはどちらも Unix エポックからのミリ秒を使い、他のほとんどのシステムは秒を使います——なので JavaScript のタイムスタンプ作業のほぼすべては × 1000 か ÷ 1000 を覚えることに帰着します。下の表はクイックリファレンスで、その後の各節で各操作を説明し、詳細ガイドでタイムゾーンと Temporal API を完全に扱います。
| タスク | コード | 結果 |
|---|---|---|
| 現在時刻(ミリ秒) | Date.now() | 1700000000000 |
| 現在時刻(秒) | Math.floor(Date.now() / 1000) | 1700000000 |
| 秒 → Date | new Date(s * 1000) | Date オブジェクト |
| ミリ秒 → Date | new Date(ms) | Date オブジェクト |
| Date → ミリ秒 | date.getTime() | 1700000000000 |
| Date → ISO 8601 | date.toISOString() | 2023-11-15T06:13:20.000Z |
| ISO 文字列 → ミリ秒 | Date.parse(str) | 1700000000000 |
現在の Unix タイムスタンプを取得する
JavaScript には、現在時刻を数値タイムスタンプとして取得する同等の方法がいくつかあります。これらはすべて Unix エポックからのミリ秒数を返します。
- Date.now() → 最も速く読みやすい —— 1700000000000(ミリ秒)
- Math.floor(Date.now() / 1000) → 秒単位の Unix タイムスタンプ —— 1700000000
- +new Date() → Date.now() と同じ、単項プラス演算子を使用
- new Date().getTime() → 明示的なメソッド呼び出し、Date.now() と同じ結果
Unix タイムスタンプから Date オブジェクトを生成する
Date コンストラクターはエポックからのミリ秒を受け取ります。秒ベースのタイムスタンプは、コンストラクターに渡す前に必ず 1000 倍してください。
- new Date(1700000000 * 1000) → 秒から(最も一般的なケース)
- new Date(1700000000000) → ミリ秒から(JavaScript の API、Java)
- new Date(Date.now()) → 現在時刻を Date オブジェクトとして
- new Date(0) → Unix エポック:1970 年 1 月 1 日 00:00:00 UTC
日付をフォーマットする —— 組み込みの文字列メソッド
Date オブジェクトには組み込みの文字列変換メソッドがいくつかあります。それぞれ異なる形式を生成します。
- .toISOString() → '2023-11-15T06:13:20.000Z' — ISO 8601、常に UTC、機械可読
- .toUTCString() → 'Wed, 15 Nov 2023 06:13:20 GMT' — RFC 7231、人間可読な UTC
- .toString() → ゾーン名を含むローカルタイムゾーンの文字列
- .toLocaleString() → ユーザーのローカルタイムゾーンでのロケール対応形式
タイムゾーン対応のフォーマット
タイムゾーン対応のフォーマットには、明示的な timeZone を付けた Intl.DateTimeFormat を使います——夏時間を自動で適用し、ライブラリは不要です。タイムゾーンはそれ自体が深いトピックで、専用の JavaScript タイムゾーンガイドが formatToParts、ユーザーのゾーン検出、難しい壁時計→UTC の方向を扱います。
- new Intl.DateTimeFormat('en-US', { timeZone: 'America/New_York', dateStyle: 'full', timeStyle: 'long' }).format(date)
- date.toLocaleString('en-GB', { timeZone: 'Europe/London', hour12: false })
日付文字列を Unix タイムスタンプに戻す
逆方向——日付文字列から Unix タイムスタンプへ——には、Date.parse() を使うか、文字列を Date コンストラクターに渡します。
- new Date('2023-11-15T06:13:20Z').getTime() / 1000 → ISO 8601 UTC からの Unix 秒
- new Date('2023-11-15T01:13:20-05:00').getTime() → オフセット付き ISO からの Unix ミリ秒
- Date.parse('2023-11-15T06:13:20Z') → new Date(...).getTime() と同じ
- 予測可能なパースのため、常に明示的なタイムゾーン付きの ISO 8601 形式を使う
よくある落とし穴
JavaScript 開発者が日付とタイムスタンプで犯す最も頻繁な間違いです:
- new Date(1700000000) — × 1000 がないと 2023 年ではなく約 1970 年に変換される
- getMonth() は 0〜11 を返し、1〜12 ではない —— 表示時は常に 1 を足す
- new Date('2024-01-01') は UTC の真夜中、new Date('2024/01/01') はローカルの真夜中
- new Date(2024, 0, 1) = 1 月 1 日(月はコンストラクターでも 0 始まり)
- 「明日」を得るために 86400000 ミリ秒を足すと DST の境界で失敗しうる —— 代わりに setDate(d.getDate() + 1) を使う
Temporal API —— Date のモダンな代替
TC39 の Temporal API は Stage 4 に達し、モダンなブラウザと Node.js に搭載されています。Date の中核的な欠陥を修正し——不変で、ナノ秒精度で、タイムゾーン対応で——Temporal.Instant がその Unix タイムスタンプ型です。搭載 API はエポックをミリ秒またはナノ秒で変換します(古い fromEpochSeconds は削除されました)ので、Unix 秒は 1000 倍します。API 全体は完全な Temporal ガイドを参照してください。
- Temporal.Now.instant() — ナノ秒精度の現在の瞬間
- Temporal.Instant.fromEpochMilliseconds(Date.now()) — JS のミリ秒タイムスタンプから
- Temporal.Instant.fromEpochMilliseconds(1700000000 * 1000) — Unix 秒から(× 1000)
- Temporal.ZonedDateTime — 瞬間 + IANA タイムゾーン、Date がそうあるべきだった型
- Firefox 139+、Chrome 144+、Node.js 26+ に搭載;Safari は Technology Preview;残りはポリフィル
さらに深く
FAQ
- JavaScript で秒単位の Unix タイムスタンプを取得するには?
- Math.floor(Date.now() / 1000) を使います。Date.now() はミリ秒を返すので、1000 で割って切り捨てると整数の Unix 秒が得られます。
- JavaScript で Unix タイムスタンプを読める日付に変換するには?
- 秒を 1000 倍して Date コンストラクターに渡し、フォーマットします:new Date(1700000000 * 1000).toISOString() は "2023-11-14T22:13:20.000Z" を返します。特定のタイムゾーンには timeZone オプション付きの Intl.DateTimeFormat を使います。
- Unix タイムスタンプを渡した new Date() が 1970 年を表示するのはなぜ?
- Date コンストラクターはミリ秒を期待します。10 桁の秒タイムスタンプは 1000 倍する必要があります:new Date(seconds * 1000)。
- JavaScript の日付を特定のタイムゾーン向けにフォーマットするには?
- 明示的な timeZone オプション付きの Intl.DateTimeFormat を使います。例:new Intl.DateTimeFormat('en-US', { timeZone: 'America/New_York' })。夏時間を自動で適用し、外部ライブラリは不要です。
- Date と Temporal のどちらを使うべき?
- ランタイムが対応している新しいコードでは Temporal を推奨します——不変で、タイムゾーン対応で、Date の地雷を避けられます。Date は単純な epoch ミリ秒の作業には今も問題なく、もっとも広くサポートされています。