Webページに「今日の日付」を表示したい場面はよくあります。フッターの著作権年、フォームのデフォルト日付、キャンペーンページの今日の日付表示など、いずれも new Date() で取得した現在日時をフォーマットして DOM に書き込むだけで実現できます。
この記事では現在の日付を YYYY/MM/DD 形式で表示する基本的な手順から、曜日付き表示・時刻表示・setInterval を使ったリアルタイム更新、そして実務でよく使われる表示パターンまでまとめて解説します。
new Date() で現在日時を取得する
引数なしの new Date() は実行した瞬間のローカル日時を保持した Date オブジェクトを返します。
const now = new Date(); console.log(now); // → Mon Apr 06 2026 09:30:00 GMT+0900 (日本標準時) // 各要素の取り出し console.log(now.getFullYear()); // 2026(4桁年) console.log(now.getMonth() + 1); // 4(月 ※0始まりなので +1 が必要) console.log(now.getDate()); // 6(日) console.log(now.getDay()); // 1(曜日:0=日〜6=土) console.log(now.getHours()); // 9(時) console.log(now.getMinutes()); // 30(分) console.log(now.getSeconds()); // 0(秒)
1月=0、2月=1、…12月=11 と、月だけが0始まりです。表示用の月の数値は必ず
getMonth() + 1 に直してください。他の getDate()(日)・getFullYear()(年)・getHours()(時)はそのまま使えます。YYYY/MM/DD 形式で表示する
日付を特定のフォーマットで表示するには、各要素を取り出して文字列に組み立てます。月・日は1桁になる場合があるので padStart(2, '0') でゼロ埋めします。
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0'); // '04'
const day = String(now.getDate()).padStart(2, '0'); // '06'
const dateStr = `${year}/${month}/${day}`; // "2026/04/06"
console.log(dateStr);
// HTML: <p id="today"></p>
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
document.getElementById('today').textContent = `${year}/${month}/${day}`;
<p>今日の日付: <span id="today"></span></p>
<script>
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
document.getElementById('today').textContent = `${year}/${month}/${day}`;
</script>
toLocaleDateString() を使う方法
ゼロ埋め処理を書かずに、ブラウザ組み込みの toLocaleDateString() でフォーマットする方法もあります。
const now = new Date();
// YYYY/MM/DD 形式(ゼロ埋めあり)
const ymd = now.toLocaleDateString('ja-JP', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
});
console.log(ymd); // "2026/04/06"
// 日本語表記(YYYY年MM月DD日)
const jpStr = now.toLocaleDateString('ja-JP', {
year: 'numeric',
month: 'long',
day: 'numeric',
});
console.log(jpStr); // "2026年4月6日"
// 曜日付き
const withDay = now.toLocaleDateString('ja-JP', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
weekday: 'short',
});
console.log(withDay); // "2026/04/06(月)"
| 手法 | コード量 | カスタム自由度 | ブラウザ依存 |
|---|---|---|---|
| 手動(padStart) | 多め | ◎ 完全自由 | なし |
| toLocaleDateString() | 少ない | ○ ロケールオプションで調整 | Intl API必要(主要ブラウザ○) |
曜日・時刻も含めて表示する
日付だけでなく曜日や時刻も一緒に表示するパターンです。
const now = new Date();
const WEEK = ['日', '月', '火', '水', '木', '金', '土'];
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
const weekday = WEEK[now.getDay()]; // getDay() 0=日〜6=土
console.log(`${year}年${month}月${day}日(${weekday})`);
// → "2026年04月06日(月)"
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
const hours = String(now.getHours()).padStart(2, '0');
const mins = String(now.getMinutes()).padStart(2, '0');
const secs = String(now.getSeconds()).padStart(2, '0');
console.log(`${year}/${month}/${day} ${hours}:${mins}:${secs}`);
// → "2026/04/06 09:30:00"
setInterval で日時をリアルタイム更新する
ページを開いたままでも常に現在時刻を表示し続けたい(デジタル時計のような表示)場合は、setInterval() で定期的に DOM を更新します。
<div id="clock">--/--/-- --:--:--</div>
<script>
function updateClock() {
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
const hours = String(now.getHours()).padStart(2, '0');
const mins = String(now.getMinutes()).padStart(2, '0');
const secs = String(now.getSeconds()).padStart(2, '0');
document.getElementById('clock').textContent =
`${year}/${month}/${day} ${hours}:${mins}:${secs}`;
}
// 即座に1回実行してから、1秒ごとに更新
updateClock();
const timerId = setInterval(updateClock, 1000);
// ページを離れるときタイマーを停止(メモリリーク防止)
window.addEventListener('beforeunload', () => clearInterval(timerId));
</script>
#clock {
font-family: 'Courier New', monospace;
font-size: 1.5rem;
font-variant-numeric: tabular-nums; /* 数字幅を均等にして桁ずれを防ぐ */
letter-spacing: 0.05em;
color: #1e293b;
}
デジタル時計では秒数が変わるたびに「1」「2」「10」などの幅が変わり、テキストが横にずれます。
font-variant-numeric: tabular-nums を指定すると、すべての数字が同じ幅で描画され、ちらつきを防げます。実践:よく使われる表示パターン
現在の日付表示が使われる具体的な実装例をまとめます。
<!-- 固定年 + 現在年で「2020 - 2026」と表示する -->
<footer>
<p>© 2020 - <span id="copy-year"></span> My Website</p>
</footer>
<script>
document.getElementById('copy-year').textContent = new Date().getFullYear();
</script>
<!-- input[type="date"] のデフォルト値には YYYY-MM-DD 形式が必要 -->
<input type="date" id="dateInput">
<script>
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
// input[type="date"] は YYYY-MM-DD 形式(スラッシュではなくハイフン)
document.getElementById('dateInput').value = `${year}-${month}-${day}`;
</script>
input[type="date"] に設定する value は YYYY/MM/DD(スラッシュ)ではなく YYYY-MM-DD(ハイフン)でなければなりません。スラッシュ区切りを設定しても表示上は変わらず、値が無効として扱われます。<div class="today-banner">
<span id="today-date"></span>
<span>現在のキャンペーン実施中</span>
</div>
<script>
const now = new Date();
const WEEK = ['日', '月', '火', '水', '木', '金', '土'];
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
const weekday = WEEK[now.getDay()];
document.getElementById('today-date').textContent =
`${year}年${month}月${day}日(${weekday})`;
</script>
DOMContentLoaded と組み合わせて安全に実行する
JavaScript を <head> 内や <body> の途中に書く場合、対象の要素が DOM に存在しないうちに getElementById() を呼ぶと null が返ってエラーになります。
// head タグ内や body 冒頭に書いてもエラーにならない
document.addEventListener('DOMContentLoaded', () => {
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
const el = document.getElementById('today');
if (el) {
el.textContent = `${year}/${month}/${day}`;
}
});
</body>の直前に書く場合 → DOMContentLoaded 不要(要素は既にある)<head>内に書く場合 →DOMContentLoadedまたはdefer属性が必要- 外部JSファイルの場合 →
<script src="..." defer></script>で defer を付けると安全
よくある質問(FAQ)
new Date('2026-04-06') のようにハイフン区切りの日付文字列を渡すと UTC の 0時として解釈され、JST(UTC+9)では前日の15時になるため日付がずれます。現在日時なら new Date()(引数なし)を使う限りはずれません。文字列からの変換については日付フォーマット変換ガイドで詳しく解説しています。const now = new Date() はその行が実行された瞬間の日時を返します。ページ読み込み時に1回だけ実行した場合、その後日付が変わっても表示は更新されません。日付が変わるタイミングでも正確な日時を表示し続けたい場合は、この記事で紹介した setInterval(updateClock, 1000) を使って毎秒再取得・再描画する方式を採用してください。innerHTML と textContent のどちらを使うべきですか?textContent を使ってください。innerHTML は文字列を HTML として解釈するため、万が一ユーザー入力を混入させると XSS(クロスサイトスクリプティング)脆弱性につながります。new Date() の出力は安全ですが、習慣として textContent を使うことをおすすめします。padStart(2, '0') の代わりに古い if (month < 10) 書き方は問題ありますか?padStart() の方が意図が明確で短く書けます。String(month).padStart(2, '0') は「文字列を最低2文字にし、不足分を先頭の ‘0’ で埋める」という意味で、if 分岐より可読性が高いため現代のJavaScriptでは padStart が推奨されます。new Date() はクライアント(ブラウザ)の OS 設定に基づくローカル日時を返します。サーバー時刻との同期が不要な「今日の日付を UI に表示する」用途なら new Date() で問題ありません。サーバーと同期した正確な時刻が必要な場合は、サーバー API から現在時刻を取得して表示する方式を採用してください。まとめ
| やりたいこと | コード |
|---|---|
| YYYY/MM/DD 取得 | `${y}/${m}/${d}`(padStart でゼロ埋め) |
| DOM に書き込む | el.textContent = dateStr |
| 曜日付き表示 | WEEK[now.getDay()] で配列から取得 |
| フォームのデフォルト値 | YYYY-MM-DD 形式(ハイフン)で .value に設定 |
| 著作権年の自動更新 | new Date().getFullYear() |
| リアルタイム更新 | setInterval(update, 1000) |
| スクリプト配置が body 上部 | DOMContentLoaded または defer |
YYYY/MM/DD 以外のフォーマット変換(ISO 8601・時刻・タイムゾーン・汎用 formatDate() 関数など)は日付のフォーマットを変換する完全ガイドで詳しく解説しています。日数差の計算や加算・減算などの日付操作についてはJavaScriptで時間の計算をマスターしようも参照してください。
