001: /*--
002:
003: Copyright (C) 2000-2003 Anthony Eden.
004: All rights reserved.
005:
006: Redistribution and use in source and binary forms, with or without
007: modification, are permitted provided that the following conditions
008: are met:
009:
010: 1. Redistributions of source code must retain the above copyright
011: notice, this list of conditions, and the following disclaimer.
012:
013: 2. Redistributions in binary form must reproduce the above copyright
014: notice, this list of conditions, and the disclaimer that follows
015: these conditions in the documentation and/or other materials
016: provided with the distribution.
017:
018: 3. The name "EdenLib" must not be used to endorse or promote products
019: derived from this software without prior written permission. For
020: written permission, please contact me@anthonyeden.com.
021:
022: 4. Products derived from this software may not be called "EdenLib", nor
023: may "EdenLib" appear in their name, without prior written permission
024: from Anthony Eden (me@anthonyeden.com).
025:
026: In addition, I request (but do not require) that you include in the
027: end-user documentation provided with the redistribution and/or in the
028: software itself an acknowledgement equivalent to the following:
029: "This product includes software developed by
030: Anthony Eden (http://www.anthonyeden.com/)."
031:
032: THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
033: WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
034: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
035: DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT,
036: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
037: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
038: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
039: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
040: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
041: IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
042: POSSIBILITY OF SUCH DAMAGE.
043:
044: For more information on EdenLib, please see <http://edenlib.sf.net/>.
045:
046: */
047:
048: package com.anthonyeden.lib.util;
049:
050: import java.util.Date;
051:
052: /** This class represents a continuous date range.
053:
054: @author Anthony Eden
055: */
056:
057: public class DateRange {
058:
059: private Date startDate;
060: private Date endDate;
061:
062: /** Construct a new DateRange with null values for the start and
063: end date.
064: */
065:
066: public DateRange() {
067:
068: }
069:
070: /** Construct a new DateRanger with the given start and end date.
071:
072: @param startDate The start date
073: @param endDate The end date
074: */
075:
076: public DateRange(Date startDate, Date endDate) {
077: setStartDate(startDate);
078: setEndDate(endDate);
079: }
080:
081: /** Get the start date. This value may be null.
082:
083: @return The start date
084: */
085:
086: public Date getStartDate() {
087: return startDate;
088: }
089:
090: /** Set the start date. This value may be null.
091:
092: @param startDate The new start date
093: */
094:
095: public void setStartDate(Date startDate) {
096: this .startDate = startDate;
097: }
098:
099: /** Get the end date. This value may be null.
100:
101: @return The end date
102: */
103:
104: public Date getEndDate() {
105: return endDate;
106: }
107:
108: /** Set the end date. This value may be null.
109:
110: @param endDate The new end date
111: */
112:
113: public void setEndDate(Date endDate) {
114: this .endDate = endDate;
115: }
116:
117: /** Return true if the given Date is after the start date and before the end
118: date. If either date is null then that part of the test will
119: automatically be true.
120:
121: @param date The Date to test
122: @return true if the Date is between the start and end date
123: */
124:
125: public boolean isWithinRange(Date date) {
126: if (startDate == null || date.after(startDate)) {
127: if (endDate == null || date.before(endDate)) {
128: return true;
129: }
130: }
131: return false;
132: }
133:
134: /** Return the number of segments in the range given that
135: a segment is <code>segmentLength</code> milliseconds.
136:
137: @param segmentLength Segment length in milliseconds
138: @return The number of segments
139: @throws IllegalStateException If either the start or end date are not
140: set
141: */
142:
143: public double getSegmentCount(int segmentLength)
144: throws IllegalStateException {
145: if (startDate == null || endDate == null) {
146: throw new IllegalStateException(
147: "Operation cannot be performed");
148: }
149:
150: long startTime = startDate.getTime();
151: long endTime = endDate.getTime();
152:
153: return (endTime - startTime) / segmentLength;
154: }
155:
156: /** Return a String representation of the DateRange.
157:
158: @return A String representing the date range
159: */
160:
161: public String toString() {
162: return "[" + startDate + " to " + endDate + "]";
163: }
164:
165: }
|