spreadsheetdate.java

来自「JfreeChart 常用图表例子」· Java 代码 · 共 496 行 · 第 1/2 页

JAVA
496
字号
    /**     * Tests the equality of this date with an arbitrary object.     * <P>     * This method will return true ONLY if the object is an instance of the     * {@link SerialDate} base class, and it represents the same day as this     * {@link SpreadsheetDate}.     *     * @param object  the object to compare (<code>null</code> permitted).     *     * @return A boolean.     */    public boolean equals(final Object object) {        if (object instanceof SerialDate) {            final SerialDate s = (SerialDate) object;            return (s.toSerial() == this.toSerial());        }        else {            return false;        }    }    /**     * Returns a hash code for this object instance.     *      * @return A hash code.     */    public int hashCode() {        return toSerial();    }    /**     * Returns the difference (in days) between this date and the specified      * 'other' date.     *     * @param other  the date being compared to.     *     * @return The difference (in days) between this date and the specified      *         'other' date.     */    public int compare(final SerialDate other) {        return this.serial - other.toSerial();    }    /**     * Implements the method required by the Comparable interface.     *      * @param other  the other object (usually another SerialDate).     *      * @return A negative integer, zero, or a positive integer as this object      *         is less than, equal to, or greater than the specified object.     */    public int compareTo(final Object other) {        return compare((SerialDate) other);        }        /**     * Returns true if this SerialDate represents the same date as the     * specified SerialDate.     *     * @param other  the date being compared to.     *     * @return <code>true</code> if this SerialDate represents the same date as     *         the specified SerialDate.     */    public boolean isOn(final SerialDate other) {        return (this.serial == other.toSerial());    }    /**     * Returns true if this SerialDate represents an earlier date compared to     * the specified SerialDate.     *     * @param other  the date being compared to.     *     * @return <code>true</code> if this SerialDate represents an earlier date     *         compared to the specified SerialDate.     */    public boolean isBefore(final SerialDate other) {        return (this.serial < other.toSerial());    }    /**     * Returns true if this SerialDate represents the same date as the     * specified SerialDate.     *     * @param other  the date being compared to.     *     * @return <code>true</code> if this SerialDate represents the same date     *         as the specified SerialDate.     */    public boolean isOnOrBefore(final SerialDate other) {        return (this.serial <= other.toSerial());    }    /**     * Returns true if this SerialDate represents the same date as the     * specified SerialDate.     *     * @param other  the date being compared to.     *     * @return <code>true</code> if this SerialDate represents the same date     *         as the specified SerialDate.     */    public boolean isAfter(final SerialDate other) {        return (this.serial > other.toSerial());    }    /**     * Returns true if this SerialDate represents the same date as the     * specified SerialDate.     *     * @param other  the date being compared to.     *     * @return <code>true</code> if this SerialDate represents the same date as     *         the specified SerialDate.     */    public boolean isOnOrAfter(final SerialDate other) {        return (this.serial >= other.toSerial());    }    /**     * Returns <code>true</code> if this {@link SerialDate} is within the      * specified range (INCLUSIVE).  The date order of d1 and d2 is not      * important.     *     * @param d1  a boundary date for the range.     * @param d2  the other boundary date for the range.     *     * @return A boolean.     */    public boolean isInRange(final SerialDate d1, final SerialDate d2) {        return isInRange(d1, d2, SerialDate.INCLUDE_BOTH);    }    /**     * Returns true if this SerialDate is within the specified range (caller     * specifies whether or not the end-points are included).  The order of d1     * and d2 is not important.     *     * @param d1  one boundary date for the range.     * @param d2  a second boundary date for the range.     * @param include  a code that controls whether or not the start and end      *                 dates are included in the range.     *     * @return <code>true</code> if this SerialDate is within the specified      *         range.     */    public boolean isInRange(final SerialDate d1, final SerialDate d2,                              final int include) {        final int s1 = d1.toSerial();        final int s2 = d2.toSerial();        final int start = Math.min(s1, s2);        final int end = Math.max(s1, s2);                final int s = toSerial();        if (include == SerialDate.INCLUDE_BOTH) {            return (s >= start && s <= end);        }        else if (include == SerialDate.INCLUDE_FIRST) {            return (s >= start && s < end);                    }        else if (include == SerialDate.INCLUDE_SECOND) {            return (s > start && s <= end);                    }        else {            return (s > start && s < end);                    }        }    /**     * Calculate the serial number from the day, month and year.     * <P>     * 1-Jan-1900 = 2.     *     * @param d  the day.     * @param m  the month.     * @param y  the year.     *     * @return the serial number from the day, month and year.     */    private int calcSerial(final int d, final int m, final int y) {        final int yy = ((y - 1900) * 365) + SerialDate.leapYearCount(y - 1);        int mm = SerialDate.AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH[m];        if (m > MonthConstants.FEBRUARY) {            if (SerialDate.isLeapYear(y)) {                mm = mm + 1;            }        }        final int dd = d;        return yy + mm + dd + 1;    }    /**     * Calculate the day, month and year from the serial number.     */    private void calcDayMonthYear() {        // get the year from the serial date        final int days = this.serial - SERIAL_LOWER_BOUND;        // overestimated because we ignored leap days        final int overestimatedYYYY = 1900 + (days / 365);        final int leaps = SerialDate.leapYearCount(overestimatedYYYY);        final int nonleapdays = days - leaps;        // underestimated because we overestimated years        int underestimatedYYYY = 1900 + (nonleapdays / 365);        if (underestimatedYYYY == overestimatedYYYY) {            this.year = underestimatedYYYY;        }        else {            int ss1 = calcSerial(1, 1, underestimatedYYYY);            while (ss1 <= this.serial) {                underestimatedYYYY = underestimatedYYYY + 1;                ss1 = calcSerial(1, 1, underestimatedYYYY);            }            this.year = underestimatedYYYY - 1;        }        final int ss2 = calcSerial(1, 1, this.year);        int[] daysToEndOfPrecedingMonth             = AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH;        if (isLeapYear(this.year)) {            daysToEndOfPrecedingMonth                 = LEAP_YEAR_AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH;        }        // get the month from the serial date        int mm = 1;        int sss = ss2 + daysToEndOfPrecedingMonth[mm] - 1;        while (sss < this.serial) {            mm = mm + 1;            sss = ss2 + daysToEndOfPrecedingMonth[mm] - 1;        }        this.month = mm - 1;        // what's left is d(+1);        this.day = this.serial - ss2                    - daysToEndOfPrecedingMonth[this.month] + 1;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?