
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()); // 例: 20250916
JavaScriptの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')); // false
YYYYMMDD形式の「日付の有効性」を厳密にチェックする
アルゴリズム:
- 文字列長・数値チェック
- 年・月・日を数値に変換して基本範囲チェック(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
の採用検討を行うと実装が堅牢になる。
以上で本記事の解説を終わります。
よいITライフを!