【JavaScript】日付をYYYYMMDD形式で取得する

【JavaScript】日付をYYYYMMDD形式で取得する

記事の文字数:2774

JavaScriptで日付を「yyyymmdd」形式に変換する方法を徹底解説します。Dateオブジェクトの基本操作からフォーマット処理、よくある落とし穴まで、実務で役立つサンプルコードを交えて詳しく紹介。これ一つで日付処理の基礎から応用まで理解できます。

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) // 2025
console.log(monthZeroBased) // 1〜12
console.log(day) // 1〜31

月と日のゼロ埋め処理(0105のように表示)

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〜12
console.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〜12
console.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/DDYYYY-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(), '')); // 20250916
console.log(formatDate(new Date(), '/')); // 2025/09/16
console.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')); // true
console.log(isYYYYMMDDFormat('2025-09-16')); // false

YYYYMMDD形式の「日付の有効性」を厳密にチェックする

アルゴリズム:

  1. 文字列長・数値チェック
  2. 年・月・日を数値に変換して基本範囲チェック(1 ≤ month ≤ 12, 1 ≤ day ≤ 31)
  3. new Date(year, month - 1, day)Date オブジェクトを作り、元の yearmonthday と一致するかを確認する(存在しない日はズレる)

実装例(厳密チェック):

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)); // true
console.log(isLeapYear(2025)); // false
console.log(isLeapYear(2026)); // false
console.log(isLeapYear(2027)); // false
console.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)文字列(YYYYMMDDYYYY-MM-DD)で保存するか、(2)UTCタイムスタンプで保存するかを仕様で統一してください。日付のみで比較したい場合は YYYYMMDD のような固定長文字列が扱いやすいです。

Q3. 日付入力フォームで YYYYMMDD を強制し、リアルタイムで検証するには?

A: 入力フィールドで input イベントを監視し、正規表現でフォーマットチェック(/^\d{0,8}$/ など)、フォーカスアウト時に厳密チェック isValidYYYYMMDD を走らせるのが一般的です。ユーザー体験向上のためには自動でフォーマット(例: 2025/09/16)に変換する UI を用意すると良いでしょう。

まとめ:JavaScriptでYYYYMMDD形式を使いこなすために

  • DategetFullYear() / 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ライフを!
Scroll to Top