80 public class SpreadsheetDate extends SerialDate {
81
82 /** Для сериализации. */
83 private static final long serialVersionUID = -2039586705374454461L;
84
85 /**
86 * Номер дня (1.01.1900 = 2, 2.01.1900 = 3, ..., 31.12.9999 =
87 * 2958465).
88 */
89 private int serial;
90
91 /** День месяца (от 1 до 28, 29, 30 или 31 в зависимости от месяца). */
92 private int day;
93
94 /** Месяц года (от 1 по 12). */
95 private int month;
96
97 /** Год (от 1900 до 9999). */
98 private int year;
99
100 /** Необязательное описание даты. */
101 private String description;
102
103 /**
104 * Создает новый экземпляр даты.
105 *
106 * @param day день (в диапазоне от 1 до 28/29/30/31).
107 * @param month месяц (в диапазоне от 1 до 12).
108 * @param year год (в диапазоне от 1900 до 9999).
109 */
110 public SpreadsheetDate(final int day, final int month, final int year) {
111
112 if ((year >= 1900) && (year <= 9999)) {
113 this.year = year;
114 }
115 else {
116 throw new IllegalArgumentException(
117 "The 'year' argument must be in range 1900 to 9999."
118 );
119 }
120
121 if ((month >= MonthConstants.JANUARY)
122 && (month <= MonthConstants.DECEMBER)) {
123 this.month = month;
124 }
125 else {
126 throw new IllegalArgumentException(
127 "The 'month' argument must be in the range 1 to 12."
128 );
129 }
130
131 if ((day >= 1) && (day <= SerialDate.lastDayOfMonth(month, year))) {
132 this.day = day;
133 }
134 else {
135 throw new IllegalArgumentException("Invalid 'day' argument.");
136 }
137
138 // Порядковый номер должен синхронизироваться с днем-месяцем-годом...
139 this.serial = calcSerial(day, month, year);
140
141 this.description = null;
142
143 }
144
145 /**
146 * Стандартный конструктор - создает новый объект даты, представляющий
147 * день с заданным номером (в диапазоне от 2 до 2958465).
148 *
149 * @param serial порядковый номер дня (диапазон: от 2 до 2958465).
150 */
151 public SpreadsheetDate(final int serial) {
152
153 if ((serial >= SERIAL_LOWER_BOUND) && (serial <= SERIAL_UPPER_BOUND)) {
154 this.serial = serial;
155 }
156 else {
157 throw new IllegalArgumentException(