Чистый код. Создание, анализ и рефакторинг — страница 87 из 94

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

  13  *

  14  * Библиотека распространяется в надежде, что она будет полезна, но

  15  * БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, даже без подразумеваемой гарантии ПРИГОДНОСТИ

  16  * для КОНКРЕТНОЙ ЦЕЛИ. За подробностями обращайтесь к GNU Lesser General

  17  * Public License.

  18  *

  19  * Вы должны получить копию лицензии GNU Lesser General Public License

  20  * с этой библиотекой; если этого не произошло, обратитесь в Free Software

  21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,

  22  * USA.

  23  *

  24  * [Java является зарегистрированной торговой маркой Sun Microsystems, Inc.

  25  * в Соединенных Штатах и других странах].

  26  *

  27  * --------------------------

  28  * RelativeDayOfWeekRule.java

  29  * --------------------------

  30  * (C) Copyright 2000–2003, by Object Refinery Limited and Contributors.

  31  *

  32  * Автор:  Дэвид Гилберт (для Object Refinery Limited);

  33  * Участники:   -;

  34  *

  35  * $Id: RelativeDayOfWeekRule.java,v 1.6 2005/11/16 15:58:40 taqua Exp $

  36  *

  37  * Изменения (начиная с 26 октября 2001)

  38  * --------------------------

  39  * 26-Oct-2001 : Пакет изменен на com.jrefinery.date.*;

  40  * 03-Oct-2002 : Исправлены ошибки по информации Checkstyle (DG);

  41  *

  42  */

  43

  44 package org.jfree.date;

  45

  46 /**

  47  * Правило ежегодной даты, возвращающее дату для каждого года на основании  

  48  *  (a) эталонного правила; (б) дня недели; и (в) параметра выбора.

  49  * (SerialDate.PRECEDING, SerialDate.NEAREST, SerialDate.FOLLOWING).

  50  * 

  51  * Например, Страстная пятница может задаваться как 'пятница, ПРЕДШЕСТВУЮЩАЯ

  52  * Пасхе'.

  53  *

  54  * @author Дэвид Гилберт

  55  */

  56 public class RelativeDayOfWeekRule extends AnnualDateRule {

  57

  58     /** Ссылка на правило ежегодной даты, на котором основано данное правило. */

  59     private AnnualDateRule subrule;

  60

  61     /**

  62      * День недели (SerialDate.MONDAY, SerialDate.TUESDAY и т.д.).

  63      */

  64     private int dayOfWeek;

  65

  66     /** Признак выбора дня недели (PRECEDING, NEAREST или FOLLOWING). */

  67     private int relative;

  68

  69     /**

  70      * Конструктор по умолчанию - строит правило для понедельника после

          1 января.

  71      */

  72     public RelativeDayOfWeekRule() {

  73         this(new DayAndMonthRule(), SerialDate.MONDAY, SerialDate.FOLLOWING);

  74     }

  75

  76     /**

  77      * Стандартный конструктор - строит правило на основании субправила.

  78      *

  79      * @param subrule  правило, определяющее эталонную дату.