Webアプリでは日付フォーマットはデータ保存・ソート・API連携・表示などで頻繁に使われます。
YYYYMMDD(例: 20250916)は、桁数が固定でソート可能(文字列順でも昇順/降順が有効)なため、バッチ処理やファイル名、シンプルなキーとして便利です。本記事では「現在日付の取得」「フォーマット」「文字列の検証」「厳密な存在チェック」まで、実務で使えるコード例を交えて解説します。
JavaScriptで現在日付をYYYYMMDD形式で取得する
Dateオブジェクトの生成と年・月・日の取得
new Date() で現在の日時を取得できます。年・月・日はそれぞれ次のメソッドで取り出します。
| 取得対象 | メソッド | 説明 |
|---|---|---|
| 年 (YYYY) | getFullYear() | 西暦を取得。(例: 2025) |
| 月 (MM) | getMonth() | 月を取得。1月は0、12月は11。0始まり のため、結果に + 1 が必須。 |
| 日 (DD) | getDate() | 日を取得。1から31の範囲。 |
重要: getMonth() は 0 始まりなので +1 が必要です。
サンプル(最小構成):
const dt = new Date();const year = dt.getFullYear();const monthZeroBased = dt.getMonth() + 1;const day = dt.getDate();console.log(year) // 2025console.log(monthZeroBased) // 1〜12console.log(day) // 1〜31月と日のゼロ埋め処理(01や05のように表示)
YYYYMMDD の各パートは常に2桁である必要があります。1桁の値に対してはゼロ埋めを行います。
手法1 — slice(-2) を使う(古くからあるテクニック)
const dt = new Date();const m = ('00' + (dt.getMonth() + 1)).slice(-2);const d = ('00' + dt.getDate()).slice(-2);console.log(m); // 01〜12console.log(d); // 01〜31手法2 — padStart を使う(読みやすい・近代的)
const dt = new Date();const m = String(dt.getMonth() + 1).padStart(2, '0');const d = String(dt.getDate()).padStart(2, '0');console.log(m); // 01〜12console.log(d); // 01〜31どちらでも構いませんが、可読性の観点から padStart を推奨します(ただし古いブラウザを対象にする場合はポリフィルが必要です)。
取得した年・月・日を結合してYYYYMMDD形式にする
getFullYear() とゼロ埋めした月・日を結合します。
完成形サンプル:
function getTodayYYYYMMDD() { const dt = new Date(); const y = dt.getFullYear(); const m = String(dt.getMonth() + 1).padStart(2, '0'); const d = String(dt.getDate()).padStart(2, '0'); return `${y}${m}${d}`;}
console.log(getTodayYYYYMMDD()); // 例: 20250916JavaScriptのYYYYMMDD形式バリエーション:区切り文字付きフォーマット
YYYY/MM/DD や YYYY-MM-DD のような区切り文字を入れたい場合は、汎用のフォーマット関数を作ると便利です。
function formatDate(date = new Date(), sep = '') { const y = date.getFullYear(); const m = String(date.getMonth() + 1).padStart(2, '0'); const d = String(date.getDate()).padStart(2, '0'); return sep ? `${y}${sep}${m}${sep}${d}` : `${y}${m}${d}`;}
console.log(formatDate(new Date(), '')); // 20250916console.log(formatDate(new Date(), '/')); // 2025/09/16console.log(formatDate(new Date(), '-')); // 2025-09-16デフォルト引数 sep = '' により、区切り無し(YYYYMMDD)をデフォルトで提供できます。
【実践】YYYYMMDD形式の文字列を検証・パースする方法
なぜYYYYMMDD形式の検証が必要なのか?
- ユーザー入力や外部APIのデータは期待する形式になっているとは限らない。
new Date()に非正規な文字列を渡すとInvalid Dateになったり、実装差で挙動が変わることがある。- 文字列として8桁であっても
20240230のように存在しない日付はあり得る。
そのため「書式(8桁の数字か)」と「日付の存在性(その日が実際に存在するか)」を分けて検証します。
YYYYMMDD形式の「書式」をチェックする
まずは単純に“8桁の数字”かをチェックします。
function isYYYYMMDDFormat(s) { return /^\d{8}$/.test(s);}
console.log(isYYYYMMDDFormat('20250916')); // trueconsole.log(isYYYYMMDDFormat('2025-09-16')); // falseYYYYMMDD形式の「日付の有効性」を厳密にチェックする
アルゴリズム:
- 文字列長・数値チェック
- 年・月・日を数値に変換して基本範囲チェック(1 ≤ month ≤ 12, 1 ≤ day ≤ 31)
new Date(year, month - 1, day)でDateオブジェクトを作り、元のyear・month・dayと一致するかを確認する(存在しない日はズレる)
実装例(厳密チェック):
function isValidYYYYMMDD(s) { if (!/^\d{8}$/.test(s)) return false;
const year = parseInt(s.slice(0, 4), 10); const month = parseInt(s.slice(4, 6), 10); const day = parseInt(s.slice(6, 8), 10);
if (month < 1 || month > 12) return false; if (day < 1 || day > 31) return false;
const dt = new Date(year, month - 1, day); return dt.getFullYear() === year && (dt.getMonth() + 1) === month && dt.getDate() === day;}
console.log(isValidYYYYMMDD('20250229')); // false (2025年は閏年ではない)console.log(isValidYYYYMMDD('20240229')); // true (2024年は閏年)console.log(isValidYYYYMMDD('20250431')); // false (4月は30日まで)閏年の判定(参考):
function isLeapYear(y) { return (y % 4 === 0 && y % 100 !== 0) || (y % 400 === 0);}console.log(isLeapYear(2024)); // trueconsole.log(isLeapYear(2025)); // falseconsole.log(isLeapYear(2026)); // falseconsole.log(isLeapYear(2027)); // falseconsole.log(isLeapYear(2028)); // trueこの isValidYYYYMMDD は実務で十分な厳密さを担保します。
JavaScriptのDateオブジェクトを扱う際の注意点
文字列からDateオブジェクトを生成する際の落とし穴
new Date(dateString)の挙動は、日付文字列の形式や実装(ブラウザ/Node.jsのバージョン)により差が出る場合があります。特にYYYY-MM-DDのような ISO 形式はタイムゾーン解釈の違いでローカル日付とずれることがあるため注意が必要です。- より安定さを求めるなら、
new Date(year, monthIndex, day)(年・月(0始まり)・日の数値を渡す)で生成することを推奨します。これは明示的にローカルタイムで日付を生成します。
// 推奨: 明示的に数値で生成const dt = new Date(2025, 8, 16); // 2025-09-16(9月は monthIndex=8)JavaScriptによるYYYYMMDD形式のよくある質問 (FAQ)
Q1. YYYYMMDD形式の文字列から Date オブジェクトを生成する安全な方法は?
A: isValidYYYYMMDD で検証した上で、new Date(year, month - 1, day) で生成するのが一番安全です。
Q2. new Date()で取得したYYYYMMDD形式をデータベースに保存する際の注意点は?
A: 保存の際は(1)文字列(YYYYMMDD や YYYY-MM-DD)で保存するか、(2)UTCタイムスタンプで保存するかを仕様で統一してください。日付のみで比較したい場合は YYYYMMDD のような固定長文字列が扱いやすいです。
Q3. 日付入力フォームで YYYYMMDD を強制し、リアルタイムで検証するには?
A: 入力フィールドで input イベントを監視し、正規表現でフォーマットチェック(/^\d{0,8}$/ など)、フォーカスアウト時に厳密チェック isValidYYYYMMDD を走らせるのが一般的です。ユーザー体験向上のためには自動でフォーマット(例: 2025/09/16)に変換する UI を用意すると良いでしょう。
まとめ:JavaScriptでYYYYMMDD形式を使いこなすために
DateとgetFullYear()/getMonth()/getDate()を使って YYYYMMDD を作るのが基本。- 月は
getMonth()が 0 始まりなので+1、月日にはゼロ埋めが必要(padStartが便利)。 - 文字列の 書式チェック(正規表現)と 日付の存在性チェック(
new Date(year, month-1, day)と元データ比較)を分けて実施する。 - 文字列から日時へ変換する際は
new Date(year, monthIndex, day)を推奨し、時刻/タイムゾーンの差に注意する。 - 実務では
date-fns/Day.js/Luxonの活用や、将来のTemporalの採用検討を行うと実装が堅牢になる。
JavaScript学習者にお勧めの本
以上で本記事の解説を終わります。
よいITライフを!