JavaScriptで日付周りをあれこれする場合、大体は何かと楽できるのもあって「Day.js」や「date-fns」のような便利ライブラリを利用しますが、それらを使わない(使えない)場面でDateオブジェクトを用いて対応するときの備忘録です。

情報取得

引数を省略した場合は、現在の日付や時刻が取得されます。

const d = new Date();
console.log(d); // Thu Mar 04 2021 12:00:00 GMT+0900

任意の日付や時刻を取得したい場合は、下記のように引数へその任意の日付や時刻を記述することで取得できます。
その際、カンマ区切りで指定する場合は「1月 = 0」になるので、サンプルのd2ように第2引数に1を指定した場合は1月ではなく2月となります。

const d1 = new Date('2021/2/21 12:34:56');
console.log(d1); // Sun Feb 21 2021 12:34:56 GMT+0900

const d2 = new Date(2021, 1, 21, 12, 34, 56);
console.log(d2); // Sun Feb 21 2021 12:34:56 GMT+0900

特定の情報を取得

年だけや月だけといったように、特定の情報を取得する際はそれぞれ下記のように記述します。
その際、上でも触れたように月の情報は「1月 = 0」になるので、取得した値に+1しておきます。 また、曜日情報については「0 = 日曜」「1 = 月曜」のように数値が返ってくるので、文字列として出力させる際は別途処理(後述します)が必要になります。

const d = new Date();
const year = d.getFullYear();
const month = d.getMonth() + 1;
const date = d.getDate();
const hour = d.getHours();
const minutes = d.getMinutes();
const seconds = d.getSeconds();
const milliSeconds = d.getMilliseconds();
const day = d.getDay();

console.log(d);                        // Thu Mar 04 2021 12:34:56 GMT+0900
console.log(`年: ${year}`);            // 年: 2021
console.log(`月: ${month}`);           // 月: 3
console.log(`日: ${date}`);            // 日: 4
console.log(`時: ${hour}`);            // 時: 12
console.log(`分: ${minutes}`);         // 分: 34
console.log(`秒: ${seconds}`);         // 秒: 56
console.log(`ミリ秒: ${milliSeconds}`); // ミリ秒: 246
console.log(`曜日: ${day}`);           // 曜日: 4

年を年付きや和暦表示にする

単純に年を取得する際はnew Date().getFullYear()で可能ですが、Intl.DateTimeFormat()を使って年付きで取得したり和暦表示で取得することができます。

const d = new Date();

console.log(d.getFullYear());
// => 2021

console.log(new Intl.DateTimeFormat('ja-JP', { year: 'numeric' }).format(d));
// => 2021年

console.log(new Intl.DateTimeFormat('ja-JP-u-ca-japanese', { year: 'numeric' }).format(d));
// => 令和3年

月・日をゼロパディングにする

月と日をゼロパディング(ゼロ埋め)表記にする方法です。
ひとまず単純に取得した場合を紹介すると、例えばnew Date('2021/4/1')からそのまま月と日を取得すると4/1となります。

const d = new Date('2021/4/1');
const month = d.getMonth() + 1;
const date = d.getDate();
console.log(`${month}/${date}`);
// => 4/1

これを04/01のようにゼロパディング表記にする方法として、下記は検索時にもよくヒットする.slice()を利用したものです。

const d = new Date('2021/4/1');
const month = (`0${d.getMonth() + 1}`).slice(-2);
const date = (`0${d.getDate()}`).slice(-2);
console.log(`${month}/${date}`);
// => 04/01

ES2017を使える環境であればpadStart()でゼロパディング表記にできます。

const d = new Date('2021/4/1');
const month = String(d.getMonth() + 1).padStart(2, 0);
const date = String(d.getDate()).padStart(2, 0);
console.log(`${month}/${date}`);
// => 04/01

Intl.DateTimeFormat()を使った方法で、両方のoptions2-digitを指定することでゼロパディング表記にできます。

const d = new Date('2021/4/1');
console.log(new Intl.DateTimeFormat('ja-JP', { month: '2-digit', day: '2-digit' }).format(d));
// => 04/01

月を英語表記にする

検索時などでもよくヒットする方法として、あらかじめ用意した英語表記の配列を利用する方法です。

const d = new Date();
console.log(d.getMonth() + 1);
// => 3

const monthList = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
console.log(monthList[d.getMonth()]);
// => March

Intl.DateTimeFormat()を使った方法で、longshortにすれば短縮表記で取得できます。

const d = new Date();
console.log(d.getMonth() + 1);
// => 3

console.log(new Intl.DateTimeFormat('en', { month: 'long' }).format(d));
// => March

console.log(new Intl.DateTimeFormat('en', { month: 'short' }).format(d));
// => Mar

曜日を文字列にする

曜日の取得はnew Date().getDay()で可能ですが、0が日曜・1が月曜・2が火曜のように、文字列ではなく06までの数値が返ってきます。 こちらも月の英語表記と同様で、文字列として表示させる方法のひとつとして配列を利用する方法があります。

const d = new Date();
console.log(d.getDay());
// => 4

const dayList = ['日', '月', '火', '水', '木', '金', '土'];
console.log(dayList[d.getDay()]);
// => 木

もしくは、文字列から参照する形で1行で取得する方法もあります。

const d = new Date();
console.log(d.getDay());
// => 4

console.log('日月火水木金土'[d.getDay()]);
// => 木

Intl.DateTimeFormat()を使う場合は、localesoptionsの組み合わせ次第で「曜日」の文字列付きで取得したり英語表記で取得することもできます。

const d = new Date();
console.log(d.getDay());
// => 4

console.log(new Intl.DateTimeFormat('ja-JP', { weekday: 'short' }).format(d));
// => 木

console.log(new Intl.DateTimeFormat('ja-JP', { weekday: 'long' }).format(d));
// => 木曜日

console.log(new Intl.DateTimeFormat('en-US', { weekday: 'short' }).format(d));
// => Thu

console.log(new Intl.DateTimeFormat('en-US', { weekday: 'long' }).format(d));
// => Thursday

平日・休日を判定する

上でも紹介したように曜日の取得は06までの数値が返ってくるので、これに剰余演算子(%)を利用して返ってくる剰余から平日か休日かを取得し、下記の場合は指定した日付が平日だったときにtrueとなります。
また、サンプルでは引数に日付を指定していますが、引数なしの場合は現在の日付を参照します。
それなりに使いまわす場合は祝日も考慮したりなど他の処理も必要になってくると思いますが、月〜金が平日で土日が休日と大雑把に取得したいときに使えます。

const isWeekday = (d = new Date()) => d.getDay() % 6 !== 0;

console.log(isWeekday(new Date('2021/4/1')));
// => true (木曜=平日なのでtrue)

console.log(isWeekday(new Date('2021/4/3')));
// => false (土曜=休日なのでfalse)

午前・午後を表記する

指定した時の値が12より大きいか小さいかで午前・午後を判別し、後者のように区分と時を一緒に出力などしたい場合は午後の時から12を引くように指定します。

const h = new Date('2021/3/4 11:22:33').getHours();

console.log(h < 12 ? '午前' : '午後');
// => 午前

console.log(h < 12 ? `午前${h}` : `午後${h - 12}`);
// => 午前11時

Intl.DateTimeFormat()を使う場合は、optionshour: 'numeric'hour12: trueを指定します。

const d = new Date('2021/3/4 11:22:33');

console.log(new Intl.DateTimeFormat('ja-JP', { hour: 'numeric', hour12: true }).format(d));
// => 午前11時

console.log(new Intl.DateTimeFormat('en-US', { hour: 'numeric', hour12: true }).format(d));
// => 11 AM

特定月の最終日を取得する

最終日を取得したい月の値(正確には取得したい月の値に+1した値)を指定して、日の指定で0を指定したDateオブジェクトから.getDate()で取得できます。
例えば、下記は「2021年2月の最終日」を取得するものです。

const lastDay = new Date(2021, 2, 0).getDate();
console.log(lastDay);
// => 28

閏年判定

上で紹介した方法を利用すれば対象年の2月最終日が29日かどうかを判断することで閏年の判定が可能になり、下記は引数に指定した年が閏年のときにtrueとなります。

const isLeapYear = (year) => new Date(year, 2, 0).getDate() === 29;

const fromYear = 2010,
      toYear = new Date().getFullYear();
for ( let i = fromYear; i <= toYear; i++ ) {
  console.log(`${i}年: ${isLeapYear(i)}`);
}
// => 2011年: false
// => 2012年: true
// => 2013年: false
// => 2014年: false
// => 2015年: false
// => 2016年: true
// => 2017年: false
// => 2018年: false
// => 2019年: false
// => 2020年: true
// => 2021年: false

日付が別の日付より前に存在するか

第1引数に指定した日付が第2引数で指定した日付より前にあるかを判定し、存在すればtrueとなります。

const isBeforeDate = (base, target) => base < target;

console.log(isBeforeDate(new Date('2021/4/1'), new Date('2021/4/15')));
// => true

console.log(isBeforeDate(new Date('2021/4/1'), new Date('2021/3/15')));
// => false

日付が別の日付より後に存在するか

第1引数に指定した日付が第2引数で指定した日付より後にあるかを判定し、存在すればtrueとなります。

const isAfterDate = (base, target) => base > target;

console.log(isAfterDate(new Date('2021/4/1'), new Date('2021/4/15')));
// => false

console.log(isAfterDate(new Date('2021/4/1'), new Date('2021/3/15')));
// => true

日付が特定の期間内に存在するか

第1引数で指定した日付から第2引数で指定した日付までの期間に第3引数で指定した日付が存在するかを判定し、存在すればtrueとなります。

const isBetweenDate = (fromDate, toDate, targetDate) => targetDate > fromDate && targetDate < toDate;

console.log(isBetweenDate(new Date('2021/4/1'), new Date('2021/4/10'), new Date('2021/4/5')));
// => true (2021/4/5は、2021/4/1〜2021/4/10間にある)

console.log(isBetweenDate(new Date('2021/4/1'), new Date('2021/4/10'), new Date('2021/4/15')));
// => false (2021/4/15は、2021/4/1〜2021/4/10間にない)

月の差分を取得する

引数に指定した月の差分を取得します。

const getDiffMonth = (fromDate, toDate) => Math.abs(toDate.getMonth() - fromDate.getMonth() + (12 * (toDate.getFullYear() - fromDate.getFullYear())));

console.log(getDiffMonth(new Date('2021/1'), new Date('2021/4')));
// => 3

console.log(getDiffMonth(new Date('2021/1'), new Date('2020/1')));
// => 12

console.log(getDiffMonth(new Date('2021/1/1'), new Date('2020/6/15')));
// => 7

日の差分を取得する

引数に指定した日の差分を取得します。

const getDiffDate = (fromDate, toDate) => Math.round(Math.abs((toDate.getTime() - fromDate.getTime()) / (24 * 60 * 60 * 1000)));

console.log(getDiffDate(new Date('2021/1/1'), new Date('2021/4/1')));
// => 90

console.log(getDiffDate(new Date('2021/1/1'), new Date('2020/12/25')));
// => 7