>
> 70 *
> 71 * Excel считает, что 1 января 1900 = 1. Этот класс считает, что
> 72 * 1 января 1900 = 2.
> 73 * В результате номер дня этого класса будет отличаться от номера Excel
> 74 * в январе и феврале 1900...но затем Excel прибавляет лишний день
> 75 * (29 февраля 1900, который в действительности не существует!), и с этого
> 76 * момента нумерация дней совпадает.
> 77 *
> 78 * @author Дэвид Гилберт
> 79 */
> 80 public class SpreadsheetDate extends SerialDate {
> 81
> 82 /** Для сериализации. */
> 83 private static final long serialVersionUID = -2039586705374454461L;
> 84
> 85 /**
Листинг Б.5 (продолжение)
> 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 * Стандартный конструктор - создает новый объект даты, представляющий