1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 package org.nuiton.util;
24
25 import java.io.Serializable;
26 import java.util.ArrayList;
27 import java.util.Calendar;
28 import java.util.Date;
29 import java.util.List;
30
31
32
33
34
35
36
37
38
39 public class PeriodDates implements Serializable {
40
41 private static final long serialVersionUID = 1L;
42
43 private String pattern;
44
45 private Calendar fromCalendar;
46
47 private Calendar thruCalendar;
48
49 public PeriodDates() {
50 }
51
52 public PeriodDates(Date fromDate, Date thruDate) throws IllegalArgumentException {
53 if (thruDate != null && fromDate != null && fromDate.after(thruDate)) {
54 throw new IllegalArgumentException("The fromDate can't be after the thruDate !");
55 }
56
57 setFromDate(fromDate);
58 setThruDate(thruDate);
59
60 pattern = DateUtil.DEFAULT_PATTERN;
61 }
62
63 public PeriodDates(Calendar fromCalendar, Calendar thruCalendar) throws IllegalArgumentException {
64 if (thruCalendar != null && fromCalendar != null && fromCalendar.after(thruCalendar)) {
65 throw new IllegalArgumentException("The fromDate can't be after the thruDate !");
66 }
67 this.fromCalendar = fromCalendar;
68 this.thruCalendar = thruCalendar;
69
70 pattern = DateUtil.DEFAULT_PATTERN;
71 }
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92 public static PeriodDates createMonthsPeriodFromToday(int monthAfter) {
93 Calendar calendarFrom = Calendar.getInstance();
94 Calendar calendarThru = Calendar.getInstance();
95
96
97 Date minTime = DateUtil.setMinTimeOfDay(new Date());
98 calendarFrom.setTime(minTime);
99 calendarThru.setTime(minTime);
100
101 if (monthAfter < 0) {
102 calendarFrom.add(Calendar.MONTH, monthAfter);
103 } else {
104 calendarThru.add(Calendar.MONTH, monthAfter);
105 }
106
107 PeriodDates period = new PeriodDates(calendarFrom, calendarThru);
108 period.initDayOfMonthExtremities();
109 period.setPattern(DateUtil.MONTH_PATTERN);
110 return period;
111 }
112
113 public String getPattern() {
114 return pattern;
115 }
116
117 public void setPattern(String pattern) {
118 this.pattern = pattern;
119 }
120
121
122 public void initDayOfMonthExtremities() {
123 if (fromCalendar == null || thruCalendar == null) {
124 throw new NullPointerException("fromDate or thruDate can't be null to" +
125 " change dayOfMonth extremities");
126 }
127 Date fromDate = fromCalendar.getTime();
128 fromDate = DateUtil.setFirstDayOfMonth(fromDate);
129 fromDate = DateUtil.setMinTimeOfDay(fromDate);
130 fromCalendar.setTime(fromDate);
131
132 Date thruDate = thruCalendar.getTime();
133 thruDate = DateUtil.setLastDayOfMonth(thruDate);
134 thruDate = DateUtil.setMaxTimeOfDay(thruDate);
135 thruCalendar.setTime(thruDate);
136 }
137
138 public void setFromDate(Date fromDate) {
139
140 if (fromDate != null) {
141 if (thruCalendar != null && fromDate.after(thruCalendar.getTime())) {
142 throw new IllegalArgumentException("The fromDate can't be after the thruDate !");
143 }
144 if (fromCalendar == null) {
145 fromCalendar = Calendar.getInstance();
146 }
147 fromCalendar.setTime(fromDate);
148 } else {
149 fromCalendar = null;
150 }
151 }
152
153 public Date getFromDate() {
154 return fromCalendar != null ? fromCalendar.getTime() : null;
155 }
156
157 public int getFromMonth() {
158 return fromCalendar.get(Calendar.MONTH);
159 }
160
161 public void setThruDate(Date thruDate) {
162
163 if (thruDate != null) {
164 if (fromCalendar != null && thruDate.before(fromCalendar.getTime())) {
165 throw new IllegalArgumentException("The thruDate can't be before the fromDate !");
166 }
167 if (thruCalendar == null) {
168 thruCalendar = Calendar.getInstance();
169 }
170 thruCalendar.setTime(thruDate);
171 } else {
172 thruCalendar = null;
173 }
174 }
175
176 public Date getThruDate() {
177 return thruCalendar != null ? thruCalendar.getTime() : null;
178 }
179
180 public List<Date> getMonths() {
181 List<Date> months = new ArrayList<Date>();
182 if (fromCalendar == null || thruCalendar == null) {
183 return months;
184 }
185
186
187
188
189
190
191
192
193 Date tmp = DateUtil.setFirstDayOfMonth(fromCalendar.getTime());
194 tmp = DateUtil.setMinTimeOfDay(tmp);
195 Calendar current = DateUtil.getDefaultCalendar(tmp);
196
197 tmp = DateUtil.setFirstDayOfMonth(thruCalendar.getTime());
198 tmp = DateUtil.setMinTimeOfDay(tmp);
199 Calendar end = DateUtil.getDefaultCalendar(tmp);
200
201 while (!current.equals(end)) {
202 months.add(current.getTime());
203 current.add(Calendar.MONTH, 1);
204 }
205 months.add(current.getTime());
206
207 return months;
208 }
209
210 public List<String> getFormatedMonths() {
211 List<String> results = new ArrayList<String>();
212 for (Date date : getMonths()) {
213 String str = DateUtil.formatDate(date, pattern);
214 results.add(str);
215 }
216 return results;
217 }
218
219 public boolean beforeEnd(Calendar calendar) {
220 return calendar.before(thruCalendar) || calendar.equals(thruCalendar);
221 }
222
223 public boolean afterEnd(Calendar calendar) {
224 return calendar.after(thruCalendar);
225 }
226
227 public boolean afterBegin(Calendar calendar) {
228 return calendar.after(fromCalendar) || calendar.equals(fromCalendar);
229 }
230
231 public boolean between(Calendar calendar) {
232 return beforeEnd(calendar) && afterBegin(calendar);
233 }
234
235 public boolean beforeEnd(Date date) {
236 Calendar calendar = DateUtil.getDefaultCalendar(date);
237 return beforeEnd(calendar);
238 }
239
240 public boolean afterEnd(Date date) {
241 Calendar calendar = DateUtil.getDefaultCalendar(date);
242 return afterEnd(calendar);
243 }
244
245 public boolean afterBegin(Date date) {
246 Calendar calendar = DateUtil.getDefaultCalendar(date);
247 return afterBegin(calendar);
248 }
249
250 public boolean between(Date date) {
251 Calendar calendar = DateUtil.getDefaultCalendar(date);
252 return between(calendar);
253 }
254
255
256 @Override
257 public String toString() {
258 String fromStr = DateUtil.formatDate(getFromDate(), pattern);
259 String thruStr = DateUtil.formatDate(getThruDate(), pattern);
260 return "[ " + getFromDate() + " (pattern: " + fromStr + ") → " +
261 getThruDate() + " (pattern: " + thruStr + ") ]";
262 }
263
264 }