>448
>449 // Вычислить год по порядковому номеру
>450 final int days = this.serial - SERIAL_LOWER_BOUND;
>451 // Переоценка из-за проигнорированных високосных дней.
>452 final int overestimatedYYYY = 1900 + (days / 365);
>453 final int leaps = SerialDate.leapYearCount(overestimatedYYYY);
>454 final int nonleapdays = days - leaps;
>455 // Недооценка из-за переоцененных лет.
>456 int underestimatedYYYY = 1900 + (nonleapdays / 365);
>457
>458 if (underestimatedYYYY == overestimatedYYYY) {
>459 this.year = underestimatedYYYY;
>460 }
>461 else {
>462 int ss1 = calcSerial(1, 1, underestimatedYYYY);
>463 while (ss1 <= this.serial) {
>464 underestimatedYYYY = underestimatedYYYY + 1;
>465 ss1 = calcSerial(1, 1, underestimatedYYYY);
>466 }
>467 this.year = underestimatedYYYY - 1;
>468 }
>469
>470 final int ss2 = calcSerial(1, 1, this.year);
>471
>472 int[] daysToEndOfPrecedingMonth
>473 = AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH;
>474
>475 if (isLeapYear(this.year)) {
>476 daysToEndOfPrecedingMonth
>477 = LEAP_YEAR_AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH;
>478 }
>479
>480 // Получение месяца по порядковому номеру
>481 int mm = 1;
>482 int sss = ss2 + daysToEndOfPrecedingMonth[mm] - 1;
>483 while (sss < this.serial) {
>484 mm = mm + 1;
>485 sss = ss2 + daysToEndOfPrecedingMonth[mm] - 1;
>486 }
>487 this.month = mm - 1;
>488
Листинг Б.5 (продолжение)
>489 // Остается d(+1);
>490 this.day = this.serial - ss2
>491 - daysToEndOfPrecedingMonth[this.month] + 1;
>492
>493 }
>494
>495 }
Листинг Б.6. RelativeDayOfWeekRule.java
> 1 /* ========================================================================
> 2 * JCommon : библиотека классов общего назначения для платформы Java(tm)
> 3 * ========================================================================
> 4 *
> 5 * (C) Copyright 2000–2005, by Object Refinery Limited and Contributors.
> 6 *
> 7 * Информация о проекте: http://www.jfree.org/jcommon/index.html
> 8 *
> 9 * Библиотека распространяется бесплатно; вы можете свободно распространять
> 10 * и/или изменять ее на условиях лицензии Lesser General Public License
> 11 * в формулировке Free Software Foundation; либо версии 2.1 лицензии, либо
> 12 * (на ваше усмотрение) любой последующей версии.