日付を「2026-09-08」や「2026年9月8日」に整形する

日付を決まった形の文字列にする方法をまとめます。Intl.DateTimeFormat と toISOString の使い分け、時間帯で結果が変わる落とし穴、月が0から始まる罠まで実行して確かめます。

実行して検証済み処理系Node 22.22.3対応ES2015難易度●●○○○目安9更新

答え

人に見せるなら Intl.DateTimeFormat時間帯を必ず書きます

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
2026年9月8日
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
2026-09-08

保存や送信に使う 2026-09-08 なら toISOString() を切ります。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
2026/9/8 2026年9月8日火曜日 21:34 Sep 8, 2026
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8

この2つで、ほとんどの用が足ります。

使い分け

用途 書き方 出るもの
画面に出す Intl.DateTimeFormat 2026年9月8日
保存・送信・比較 toISOString().slice(0, 10) 2026-09-08
ファイル名 同上 2026-09-08

人に見せる形と、機械が読む形を混ぜないでください。 2026年9月8日 を保存すると、あとで並べ替えも比較もできなくなります。

見せ方をもっと細かく

dateStyletimeStyle の組み合わせで、たいていの形が作れます。

javascript
const today = new Date();

console.log(today.toISOString().slice(0, 10));
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
2026-09-08 2026-09-09

曜日も、英語表記も、自分で表を持たずに出せます。 ja-JPen-US に変えるだけで英語になります。

いちばん多い落とし穴:時間帯

Intl の例で timeZone を毎回書いているのには理由があります。 書かないと、実行した環境の時間帯で結果が変わります。

上の例の日付は協定世界時12:34 です。 これを日本時間で見れば 21:34、ニューヨークで見れば同じ日の朝になります。 同じコードなのに、見る場所で違う日付が出ます。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
8 2026-09-08 05:03

上の例には出力を載せていません。 載せられないからです。 実行して、2行が同じになるか確かめてみてください。 日本時間の環境なら同じになります。違う地域なら1行目だけずれます。

保存するなら、時間帯の要らない toISOString() を使ってください。 これは常に協定世界時なので、どこで実行しても同じ文字列になります。

「今日」を使うとき

new Date()実行した瞬間を持ちます。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
2026-09-08T00:00:00.000Z

このページのコード例は掲載してある出力と突き合わせているので、実行のたびに変わるものは載せていません。上の例は形だけです。

「今日」を日本時間で決めたいときは、時間帯を指定して取り出します。

javascript
console.log(new Date('2026/09/08').toISOString());
javascript
const date = new Date('きのう');

console.log(String(date));
console.log(date.getTime());
Invalid Date NaN

sv-SE(スウェーデン語)を使うと YYYY-MM-DD の形で出ます。時間帯を指定した ISO 風の日付を作る近道としてよく使われます。

自分で組み立てる

Intl を使わず、成分から作ることもできます。月が0から始まることに注意してください。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
2026-09-08T00:00:00.000Z 読めません

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.DateTimeFormattimeZone を必ず書く
  • 保存・比較なら toISOString().slice(0, 10)。どこでも同じ
  • timeZone を省くと、読み手の場所で日付が変わる
  • getMonth()0始まり。+ 1 を忘れない
  • - は協定世界時、/ はローカル。混ぜない
  • 読めない文字列でも例外は出ない。Number.isNaN(date.getTime()) で見る

桁を揃える padStart() そのものの挙動(すでに長いとき、埋める文字が複数のとき)はこちらにあります。 → 文字列を切り出す・整える

日付の文字列を数値として扱いたいときの落とし穴(NaN の見分け方)は、こちらでも扱っています。 → 文字列を数値に変換する

この記事の根拠

  1. Date Objects — ECMAScript® 2026 Language Specificationtc39.es
  2. Intl.DateTimeFormat — ECMAScript® 2026 Internationalization API Specificationtc39.es
  3. Date.prototype.toISOString — MDNdeveloper.mozilla.org

掲載しているコード例は、公開前に読み手が押したときに動くのと同じもので実行して出力を突き合わせています。結果はリポジトリに残しています。

このページの原文(Markdown)