JavaScriptでやってみる「今日は今年の何日目?」

こんにちは、さるまりんです。

これを書いている今日は1月20日。今年になって20日。わかりやすいですね。

では3月15日だったらどうでしょうか?一瞬で何日ってわかるかたもいるかもですが、一般的には難しいと思います。

JavaScriptでやってみようというのが今回の趣旨です。

今日は今年の何日目?

この数字はは次のように求めることができます。

  1. 現在の日付を取得する。(○月×日)
  2. 前月(○-1月)末までの日数を求める。(△日)
  3. 2で求めた数と現在の日を足す。(△+×日)

(△は現在の月が1月の場合は0日です。)

JavaScriptでやるとこんな風になります。

// うるう年かどうかをチェック
function isLeapYear(year) {
    return (year%4 == 0) && (year%100 != 0) || (year%400 == 0) ? true : false;
}
// 配列nosの0からindexまでの値を加算する
function sumUpTo(index, nos) {
    // 合計値をもつ変数
    var sum = 0;
    // indexは最大でnosの長さとする
    if(index > nos.length)
        index = nos.length;
    // 0からindexか配列の長さまで
    for(var i = 0; i < index; i++) {
        // 値を加算
        sum+=nos[i];
    }
    // 求められた値を返却
    return sum;
}
// 年を指定し前月末ですぎる日数を配列で作成する
// 1月は0日、2月は31日、3月は59日 or 60日・・・
function generateDaysPassedInMonthList(year) {
    // 与えられた年がうるう年かを判断
    var leapYear = isLeapYear(year);
    // 2月の日数を決定
    var daysInFeb = leapYear ? 29 : 28;
    // 各月の日数をもつ配列を作成 1月なら31日、2月なら28 or 29日・・・
    var daysInMonth = [31, daysInFeb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    // それらを加算し前月月末ですぎる日数の配列にする
    var days = [];
    for(var i = 0; i < daysInMonth.length; i++) {
        days[i] = i == 0 ? 0 : sumUpTo(i, daysInMonth);
    }
    // 作成された配列を返却
    return days;
}

// 年の何日目かを取得する
function getDaysInYear() {
    // 現在の日時を取得 (○月×日)
    var current = new Date();
    // 前月末までで計画する日数の配列を取得
    var daysInMonth = generateDaysPassedInMonthList(current.getFullYear());
    // 現在の月を取得 (getMonth()は1月を0、2月を1と返却)
    var currentMonth = current.getMonth();
    // 前月末までの日数を取得(△日)
    var passedDaysByPrevMonth = daysInMonth[currentMonth];
    // 前月末までの日数と月内の日数を加算 (△+×日)
    var daysInYear = passedDaysByPrevMonth + current.getDate();
    return daysInYear;
}

どうでしょう。

下には正しい経過日数が表示されているでしょうか?

今日は今年のX日目です。

今回はこれまでに作成したうるう年か判断する方法配列の値を加算する方法を利用してみました。

問題を分解するとわかりやすくなりますね。

ないものは作る。プログラミングって楽しいです。

読んでくださってありがとうございます。

それではまた!