001/* ===========================================================
002 * JFreeChart : a free chart library for the Java(tm) platform
003 * ===========================================================
004 *
005 * (C) Copyright 2000-2013, by Object Refinery Limited and Contributors.
006 *
007 * Project Info:  http://www.jfree.org/jfreechart/index.html
008 *
009 * This library is free software; you can redistribute it and/or modify it
010 * under the terms of the GNU Lesser General Public License as published by
011 * the Free Software Foundation; either version 2.1 of the License, or
012 * (at your option) any later version.
013 *
014 * This library is distributed in the hope that it will be useful, but
015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
017 * License for more details.
018 *
019 * You should have received a copy of the GNU Lesser General Public
020 * License along with this library; if not, write to the Free Software
021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
022 * USA.
023 *
024 * [Oracle and Java are registered trademarks of Oracle and/or its affiliates. 
025 * Other names may be trademarks of their respective owners.]
026 *
027 * --------------
028 * DateRange.java
029 * --------------
030 * (C) Copyright 2002-2008, by Object Refinery Limited and Contributors.
031 *
032 * Original Author:  David Gilbert (for Object Refinery Limited);
033 * Contributor(s):   Bill Kelemen;
034 *
035 * Changes
036 * -------
037 * 22-Apr-2002 : Version 1 based on code by Bill Kelemen (DG);
038 * 07-Oct-2002 : Fixed errors reported by Checkstyle (DG);
039 * 23-Sep-2003 : Minor Javadoc update (DG);
040 * 28-May-2008 : Fixed problem with immutability (DG);
041 * 01-Sep-2008 : Added getLowerMillis() and getUpperMillis() (DG);
042 *
043 */
044
045package org.jfree.data.time;
046
047import java.io.Serializable;
048import java.text.DateFormat;
049import java.util.Date;
050
051import org.jfree.data.Range;
052
053/**
054 * A range specified in terms of two <code>java.util.Date</code> objects.
055 * Instances of this class are immutable.
056 */
057public class DateRange extends Range implements Serializable {
058
059    /** For serialization. */
060    private static final long serialVersionUID = -4705682568375418157L;
061
062    /** The lower bound for the range. */
063    private long lowerDate;
064
065    /** The upper bound for the range. */
066    private long upperDate;
067
068    /**
069     * Default constructor.
070     */
071    public DateRange() {
072        this(new Date(0), new Date(1));
073    }
074
075    /**
076     * Constructs a new range.
077     *
078     * @param lower  the lower bound (<code>null</code> not permitted).
079     * @param upper  the upper bound (<code>null</code> not permitted).
080     */
081    public DateRange(Date lower, Date upper) {
082        super(lower.getTime(), upper.getTime());
083        this.lowerDate = lower.getTime();
084        this.upperDate = upper.getTime();
085    }
086
087    /**
088     * Constructs a new range using two values that will be interpreted as
089     * "milliseconds since midnight GMT, 1-Jan-1970".
090     *
091     * @param lower  the lower (oldest) date.
092     * @param upper  the upper (most recent) date.
093     */
094    public DateRange(double lower, double upper) {
095        super(lower, upper);
096        this.lowerDate = (long) lower;
097        this.upperDate = (long) upper;
098    }
099
100    /**
101     * Constructs a new range that is based on another {@link Range}.  The
102     * other range does not have to be a {@link DateRange}.  If it is not, the
103     * upper and lower bounds are evaluated as milliseconds since midnight
104     * GMT, 1-Jan-1970.
105     *
106     * @param other  the other range (<code>null</code> not permitted).
107     */
108    public DateRange(Range other) {
109        this(other.getLowerBound(), other.getUpperBound());
110    }
111
112    /**
113     * Returns the lower (earlier) date for the range.
114     *
115     * @return The lower date for the range.
116     *
117     * @see #getLowerMillis()
118     */
119    public Date getLowerDate() {
120        return new Date(this.lowerDate);
121    }
122
123    /**
124     * Returns the lower bound of the range in milliseconds.
125     *
126     * @return The lower bound.
127     *
128     * @see #getLowerDate()
129     *
130     * @since 1.0.11
131     */
132    public long getLowerMillis() {
133        return this.lowerDate;
134    }
135
136    /**
137     * Returns the upper (later) date for the range.
138     *
139     * @return The upper date for the range.
140     *
141     * @see #getUpperMillis()
142     */
143    public Date getUpperDate() {
144        return new Date(this.upperDate);
145    }
146
147    /**
148     * Returns the upper bound of the range in milliseconds.
149     *
150     * @return The upper bound.
151     *
152     * @see #getUpperDate()
153     *
154     * @since 1.0.11
155     */
156    public long getUpperMillis() {
157        return this.upperDate;
158    }
159
160    /**
161     * Returns a string representing the date range (useful for debugging).
162     *
163     * @return A string representing the date range.
164     */
165    @Override
166    public String toString() {
167        DateFormat df = DateFormat.getDateTimeInstance();
168        return "[" + df.format(getLowerDate()) + " --> "
169                + df.format(getUpperDate()) + "]";
170    }
171
172}