Чистый код. Создание, анализ и рефакторинг (Мартин) - страница 298

>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  * (на ваше усмотрение) любой последующей версии.