CalcDate.set()

------------------------------------

CalcDateクラスの根幹をなす二つのメソッドのうちの一つset()を見ていきましょう。「年月日」をセットすると同時に、その日の「西暦1年1月1日からの日数」を計算します。

シグニチャは

void set(int year, int month, int date)

になります。以下では1996年12月12日を設定する場合を考えながら説明していきます。

まず

this.year = year;
this.month = month;
this.date = date;

で「年月日」をセットします。ここで考えている例ではyear=1996month=12date=12になります。

------------------------------------

そして

pastDays = 0;

pastDays += (year - 1) * 365 +
                (year - 1) / 4 - (year - 1) / 100 + (year - 1) /400;

で前年までの日数を計算します。考えている例では1995年12月31日までの日数が計算されます。

(year - 1) * 365

はすぐに解ると思いますが、その後ろに続く

(year - 1) / 4 - (year - 1) / 100 + (year - 1) /400

は何でしょう?

答えは閏年の処理です。閏年の規則は後程メソッドisLeapYear()のところで説明するので、それを読んでから読み返していただければ解ると思います。

------------------------------------

続いて

for (int i = 0; i < month - 1; i++) {
    pastDays += monthDays[i];
    if (i == 1 && isLeapYear(year)) {
        pastDays++;
    }
}

で前月までの日数を計算します。いま考えている例ではmonth=12となっていますからi=0,1,2,3,4,5,6,7,8,9,10と変化し31+28+31+30+31+30+31+31+30+31+30pastDaysに加えられ、1996年11月30日までの日数が計算されることになります。

forループの中にある

if (i == 1 && isLeapYear(year)) {
    pastDays++;
}

が閏年の処理をしている部分です。計算する年が閏年(isLeapYear(year)が真)で2月の処理をしている場合(iが1のとき)に2月29日の分を付け加えます。1996年は閏年なのでこの処理が行なわれます。

------------------------------------

最後に

pastDays += date;

で残った日を付け加えます。考えている例では12が加えられます。これで「西暦1年1月1日からの日数」の計算終了です。

------------------------------------

前の項目へ次の項目へ

「メイキング・オブ・バイオリズム」のページへ