答え
人に見せるなら Intl.DateTimeFormat。時間帯を必ず書きます。
保存や送信に使う 2026-09-08 なら toISOString() を切ります。
この2つで、ほとんどの用が足ります。
使い分け
| 用途 | 書き方 | 出るもの |
|---|---|---|
| 画面に出す | Intl.DateTimeFormat |
2026年9月8日 |
| 保存・送信・比較 | toISOString().slice(0, 10) |
2026-09-08 |
| ファイル名 | 同上 | 2026-09-08 |
人に見せる形と、機械が読む形を混ぜないでください。
2026年9月8日 を保存すると、あとで並べ替えも比較もできなくなります。
見せ方をもっと細かく
dateStyle と timeStyle の組み合わせで、たいていの形が作れます。
const today = new Date();
console.log(today.toISOString().slice(0, 10));曜日も、英語表記も、自分で表を持たずに出せます。
ja-JP を en-US に変えるだけで英語になります。
いちばん多い落とし穴:時間帯
Intl の例で timeZone を毎回書いているのには理由があります。
書かないと、実行した環境の時間帯で結果が変わります。
上の例の日付は協定世界時で 12:34 です。
これを日本時間で見れば 21:34、ニューヨークで見れば同じ日の朝になります。
同じコードなのに、見る場所で違う日付が出ます。
上の例には出力を載せていません。 載せられないからです。 実行して、2行が同じになるか確かめてみてください。 日本時間の環境なら同じになります。違う地域なら1行目だけずれます。
保存するなら、時間帯の要らない toISOString() を使ってください。
これは常に協定世界時なので、どこで実行しても同じ文字列になります。
「今日」を使うとき
new Date() は実行した瞬間を持ちます。
このページのコード例は掲載してある出力と突き合わせているので、実行のたびに変わるものは載せていません。上の例は形だけです。
「今日」を日本時間で決めたいときは、時間帯を指定して取り出します。
console.log(new Date('2026/09/08').toISOString());const date = new Date('きのう');
console.log(String(date));
console.log(date.getTime());sv-SE(スウェーデン語)を使うと YYYY-MM-DD の形で出ます。時間帯を指定した ISO 風の日付を作る近道としてよく使われます。
自分で組み立てる
Intl を使わず、成分から作ることもできます。月が0から始まることに注意してください。
getMonth() は8を返します。9月なのに8です。
+ 1 を忘れると1か月ずれます。日付だけ getDate() が1始まりなので、余計に間違えやすい場所です。
上の例は new Date(2026, 8, 8) と成分から作っています。この作り方と getMonth() などの読み方はどちらもローカル時間なので、どこで実行しても同じ結果になります。
よくある間違い
- と / で意味が変わる
ハイフンで書いた日付は、どこで実行しても同じ瞬間になります。
スラッシュで書くと、そうなりません。
この例にも出力を載せていません。 環境で変わるからです。
実行して、上の 00:00:00.000Z と同じになるか確かめてみてください。
2026-09-08(ハイフン)… ISO 8601として読まれ、協定世界時の0時2026/09/08(スラッシュ)… 実行環境の時間帯の0時
日本時間なら9時間ずれます。日付だけを比べているつもりで、時刻がずれて前日になります。
文字列から日付を作るなら、ハイフンの ISO 形式に統一してください。
壊れた日付に気づかない
例外は出ません。 Invalid Date という日付になり、以後の計算が全部 NaN になります。
受け取った文字列から日付を作るときは、必ず確かめてください。
getTime() が NaN かどうかが、唯一の判定方法です。
date === 'Invalid Date' のような比較は効きません。
まとめ
- 人に見せるなら
Intl.DateTimeFormat。timeZoneを必ず書く - 保存・比較なら
toISOString().slice(0, 10)。どこでも同じ timeZoneを省くと、読み手の場所で日付が変わるgetMonth()は0始まり。+ 1を忘れない-は協定世界時、/はローカル。混ぜない- 読めない文字列でも例外は出ない。
Number.isNaN(date.getTime())で見る
桁を揃える padStart() そのものの挙動(すでに長いとき、埋める文字が複数のとき)はこちらにあります。
→ 文字列を切り出す・整える
日付の文字列を数値として扱いたいときの落とし穴(NaN の見分け方)は、こちらでも扱っています。
→ 文字列を数値に変換する