JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで日付(年・月・日)から曜日を求める方法

本記事では、日・月・年の3つの引数を受け取り、その日付が何曜日であるかを返すJavaScript関数の実装方法を詳しく解説します。

たとえば、次のような入力が与えられた場合を考えてみましょう。

day = 15,
month = 8,
year = 1993

出力

この場合、関数の出力は次のようになります。

const output = 'Sunday'

サンプルコード

実際のコードは以下のとおりです。

const dayOfTheWeek = (day, month, year) => {
    // JavaScriptの月は0始まりなので調整
    return dayOfTheWeekJS(day, month - 1, year);
}
function dayOfTheWeekJS(day, month, year) {
    const DAYS = [
        'Sunday',
        'Monday',
        'Tuesday',
        'Wednesday',
        'Thursday',
        'Friday',
        'Saturday',
    ];
    const DAY_1970_01_01 = 4;
    let days = day - 1;
    while (month - 1 >= 0) {
        days += daysInMonthJS(month - 1, year);
        month -= 1;
    }
    while (year - 1 >= 1970) {
        days += daysInYear(year - 1);
        year -= 1;
    }
    return DAYS[(days + DAY_1970_01_01) % DAYS.length];
};
function daysInMonthJS(month, year) {
    const days = [
        31, // 1月
        28 + (isLeapYear(year) ? 1 : 0), // 2月(閏年対応)
        31, // 3月
        30, // 4月
        31, // 5月
        30, // 6月
        31, // 7月
        31, // 8月
        30, // 9月
        31, // 10月
        30, // 11月
        31, // 12月
    ];
    return days[month];
}
function daysInYear(year) {
    return 365 + (isLeapYear(year) ? 1 : 0);
}
function isLeapYear(year) {
    return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;
}
console.log(dayOfTheWeek(15, 8, 1993));

アルゴリズムの解説

このアプローチの核心は、「指定した日付までの総日数」を数え上げることです。基準点にはUnixエポック(1970年1月1日=木曜日)を採用します。具体的な手順は次のとおりです。

  • 完全に経過した年数分の日数を合計する

  • 対象年内の経過月分の日数を合計する

  • 当月内の残りの日数を加算する

こうして求めた総日数に、1970年1月1日の曜日オフセット(木曜日=4)を加算し、7で割った余りをインデックスとして使うことで、配列DAYSから対応する曜日名を取り出します。isLeapYear()関数による閏年の判定も組み込まれているため、どの年に対しても正確な計算が可能です。

出力結果

コンソールには次のように表示されます。

Sunday

補足:組み込みのDateオブジェクトを使う方法

なお、実務開発では標準のDateオブジェクトを使うと、より簡潔に同じ結果を得られます。

const getDayOfWeek = (day, month, year) => {
    const DAYS = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
    // 月は0始まりのため-1する
    return DAYS[new Date(year, month - 1, day).getDay()];
};
console.log(getDayOfWeek(15, 8, 1993)); // Sunday

学習目的でアルゴリズムを理解したい場合は前者、実務で手早く実装したい場合は後者を選ぶとよいでしょう。

  1. JavaScriptで日付の「日」を設定する方法|setDate()の使い方を解説

    JavaScriptでは、DateオブジェクトのsetDate()メソッドを使うことで、日付の「日」(1〜31)を設定・変更できます。この記事では、実際のコード例と実行結果をもとに、setDate()の基本的な使い方をわかりやすく解説します。 setDate()メソッドとは setDate()は、Dateオブジェクトの「日」の値だけを変更するためのメソッドです。年や月はそのままに、日にちだけを差し替えたい場合に便利です。引数には1〜31の整数を指定しますが、範囲外の値を渡してもエラーにはならず、自動的に月をまたいだ日付へと調整されます。また、このメソッドは元のDateオブジェクト自体を書き換え

  2. 【JavaScript入門】日付を1日前に戻す(デクリメントする)方法をわかりやすく解説

    JavaScriptでは、Dateオブジェクトが持つgetDate()メソッドとsetDate()メソッドを組み合わせることで、現在の日付から簡単に1日(あるいは任意の日数)を減算することができます。 この記事では、ボタンをクリックすると表示中の日付が1日前に戻るサンプルプログラムを紹介します。 実装例 以下のコードは、日付を1日デクリメント(前日に戻す)するシンプルなHTML+JavaScriptのプログラムです。 <!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <