001 // Copyright (c) 2001 Hursh Jain (http://www.mollypages.org)
002 // The Molly framework is freely distributable under the terms of an
003 // MIT-style license. For details, see the molly pages web site at:
004 // http://www.mollypages.org/. Use, modify, have fun !
005
006 package fc.util;
007
008 import java.util.*;
009
010 /**
011 A range of dates.
012 <p>
013
014 @author hursh jain
015 **/
016 public class DateRange extends Range
017 {
018 Date start;
019 Date end;
020
021 /**
022 Constructs a date range between the specified start and end
023 dates (both inclusive).
024
025 @throws IllegalArgumentException
026 if the end date is lesser (via an <tt>compareTo</tt>
027 comparison) than the start date (equal to the start date
028 is ok)
029 **/
030 public DateRange(Date start, Date end)
031 {
032 Argcheck.istrue(start.compareTo(end) <= 0, "end lesser than start in the specified range, start=["+start+"], end=["+end+"]");
033 this.start = start;
034 this.end = end;
035 }
036
037 /** Get the start date for this range **/
038 public Date getStart()
039 {
040 return start;
041 }
042
043
044 /** Get the end date for this range **/
045 public Date getEnd()
046 {
047 return end;
048 }
049
050 /**
051 @return true if the passed in date is inside this range. Note,
052 the <u>entire</u> date (including the milliseconds/seconds portion)
053 is considered by this function.
054
055 @throws IllegalArgumentException
056 if the specified date was null
057 **/
058 public boolean inRange(Date d)
059 {
060 Argcheck.notnull(d);
061 boolean result = d.compareTo(start) >= 0 &&
062 d.compareTo(end) <= 0;
063
064 if (negated)
065 return !result;
066 else
067 return result;
068 }
069
070
071 /**
072 @return true if any part of the passed in date range overlaps this range. Note,
073 the <u>entire</u> date (including the milliseconds/seconds portion) is considered by this function.
074
075 @throws IllegalArgumentException
076 if the specified date was null
077 **/
078 public boolean overlaps(DateRange dr)
079 {
080 Argcheck.notnull(dr);
081
082 boolean result = inRange(dr.getStart()) || inRange(dr.getEnd());
083 if (negated)
084 return !result;
085 else
086 return result;
087 }
088
089
090 /**
091 Set the start date for this range
092
093 @throws NullPointerException
094 if the specified date was null
095 @throws IllegalArgumentException
096 if the specified date is greater (via an <tt>compareTo</tt>
097 comparison) than the currently set end date (equal to the
098 end date is ok)
099 **/
100 public void setStart(Date d)
101 {
102 Argcheck.notnull(d, "specified argument was null");
103 Argcheck.istrue(d.compareTo(end) <= 0, "start greater than end date, specified start=["+d+"], end=["+end+"]");
104 start = d;
105 }
106
107 /**
108 Sets the end date for this range
109
110 @param d the end date
111
112 @throws NullPointerException
113 if the specified date was null
114 @throws IllegalArgumentException
115 if the specified end date is lesser (via an <tt>compareTo</tt>
116 comparison) than the currently set start date (equal to
117 the start date is ok)
118 **/
119 public void setEnd(Date d)
120 {
121 Argcheck.notnull(d, "specified argument was null");
122 Argcheck.istrue(d.compareTo(start) >= 0, "end lesser than start, start=["+start+"], specified end=["+d+"]");
123 end = d;
124 }
125
126
127 /** Output a string representation of the date range **/
128 public java.lang.String toString()
129 {
130 String str = "DateRange:[";
131 if (isNegated())
132 str += "^";
133 str += start + "," + end + "]";
134 return str;
135 }
136
137 public static void main(String[] args)
138 {
139 Calendar cal = Calendar.getInstance();
140 Date d1 = cal.getTime();
141
142 //roll back 1 month
143 // cal.set(Calendar.MONTH, false);
144 cal.add(Calendar.MONTH, -1);
145 Date d2 = cal.getTime();
146
147 DateRange r = new DateRange(d2, d1);
148 System.out.println("constructed range:" + r);
149 //normal
150 test(r);
151
152 System.out.println();
153
154 DateRange r2 = new DateRange(d2, new Date(d1.getTime() - CalendarUtil.ONE_DAY));
155 System.out.println("r1:" + r + "\n -- overlaps? --\n" + "r2:" + r2);
156 System.out.println();
157 System.out.println("r1 overlaps r2 (should be true): " + r.overlaps(r2));
158 System.out.println("r2 overlaps r1 (should be true): " + r2.overlaps(r));
159
160 System.out.println("----------------------------------");
161
162 r2 = new DateRange(
163 new Date(d1.getTime() + CalendarUtil.ONE_DAY),
164 new Date(d1.getTime() + CalendarUtil.THREE_DAY));
165
166 System.out.println("r1:" + r + "\n -- overlaps? --\n" + "r2:" + r2);
167 System.out.println();
168 System.out.println("r1 overlaps r2 (should be false): " + r.overlaps(r2));
169 System.out.println("r2 overlaps r1 (should be false): " + r2.overlaps(r));
170
171 System.out.println("----------------------------------");
172
173 r2 = new DateRange(
174 new Date(d2.getTime() - CalendarUtil.THREE_DAY),
175 new Date(d2.getTime() - CalendarUtil.ONE_DAY));
176
177 System.out.println("r1:" + r + "\n -- overlaps? --\n" + "r2:" + r2);
178 System.out.println();
179 System.out.println("r1 overlaps r2 (should be false): " + r.overlaps(r2));
180 System.out.println("r2 overlaps r1 (should be false): " + r2.overlaps(r));
181
182 System.out.println("----------------------------------");
183
184 }
185
186 private static void test(DateRange r)
187 {
188 Date d = new Date();
189
190 System.out.println("in range: " + d + "=" + r.inRange(d));
191
192 Calendar cal = Calendar.getInstance();
193 cal.setTime(d);
194 cal.add(Calendar.MONTH, -2);
195
196 d = cal.getTime();
197 System.out.println("in range: " + d + "=" + r.inRange(d));
198
199 cal.add(Calendar.MONTH, 2);
200 cal.roll(Calendar.DAY_OF_MONTH, false);
201 d = cal.getTime();
202 System.out.println("in range: " + d + "=" + r.inRange(d));
203 }
204
205 } //~class CharRange