> 5 public class SpreadsheetDateFactory extends DayDateFactory {
> 6 public DayDate _makeDate(int ordinal) {
> 7 return new SpreadsheetDate(ordinal);
> 8 }
> 9
> 10 public DayDate _makeDate(int day, Month month, int year) {
> 11 return new SpreadsheetDate(day, month, year);
> 12 }
> 13
> 14 public DayDate _makeDate(int day, int month, int year) {
> 15 return new SpreadsheetDate(day, month, year);
> 16 }
> 17
> 18 public DayDate _makeDate(Date date) {
> 19 final GregorianCalendar calendar = new GregorianCalendar();
> 20 calendar.setTime(date);
> 21 return new SpreadsheetDate(
> 22 calendar.get(Calendar.DATE),
> 23 Month.fromInt(calendar.get(Calendar.MONTH) + 1),
> 24 calendar.get(Calendar.YEAR));
> 25 }
> 26
> 27 protected int _getMinimumYear() {
> 28 return SpreadsheetDate.MINIMUM_YEAR_SUPPORTED;
> 29 }
> 30
> 31 protected int _getMaximumYear() {
> 32 return SpreadsheetDate.MAXIMUM_YEAR_SUPPORTED;
> 33 }
> 34 }
Листинг Б.16. SpreadsheetDate.java (окончательная версия)
> 1 /* ========================================================================
> 2 * JCommon : библиотека классов общего назначения для платформы Java(tm)
> 3 * ========================================================================
> 4 *
> 5 * (C) Copyright 2000–2005, by Object Refinery Limited and Contributors.
> 6 *
>...
> 52 *
> 53 */
> 54
> 55 package org.jfree.date;
> 56
> 57 import static org.jfree.date.Month.FEBRUARY;
> 58
> 59 import java.util.*;
> 60
> 61 /**
> 62 * Представляет дату с использованием целого числа, по аналогии с реализацией
> 63 * в Microsoft Excel. Поддерживаемый диапазон дат:
> 64 * с 1 января 1900 по 31 декабря 9999.
> 65 *
> 66 * Учтите, что в Excel существует намеренная ошибка, вследствие которой год
> 67 * 1900 считается високосным, тогда как в действительности он таковым не является.
> 68 * Дополнительная информация приведена на сайте Microsoft в статье Q181370:
> 69 *
> 70 * http://support.microsoft.com/support/kb/articles/Q181/3/70.asp
> 71 *
> 72 * По правилам Excel 1 января 1900 = 1. По правилам этого класса
> 73 * 1 января 1900 = 2.
> 74 * В результате номер дня этого класса будет отличаться от номера Excel
> 75 * в январе и феврале 1900...но затем Excel прибавляет лишний день
> 76 * (29 февраля 1900, который в действительности не существует!), и с этого
> 77 * момента нумерация дней совпадает.
> 78 *
> 79 * @author David Gilbert
> 80 */
> 81 public class SpreadsheetDate extends DayDate {
> 82 public static final int EARLIEST_DATE_ORDINAL = 2; // 1/1/1900