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=1996、month=12、date=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+30がpastDaysに加えられ、1996年11月30日までの日数が計算されることになります。
forループの中にある
if (i == 1 && isLeapYear(year)) {
pastDays++;
}
が閏年の処理をしている部分です。計算する年が閏年(isLeapYear(year)が真)で2月の処理をしている場合(iが1のとき)に2月29日の分を付け加えます。1996年は閏年なのでこの処理が行なわれます。
最後に
pastDays += date;
で残った日を付け加えます。考えている例では12が加えられます。これで「西暦1年1月1日からの日数」の計算終了です。