1 package com.atlassian.jira.util;
2
3 import java.util.Calendar;
4 import java.util.Date;
5 import java.util.regex.Matcher;
6 import java.util.regex.Pattern;
7
8 import electric.xml.ParseException;
9
10 public class RelativeDatetools {
11
12
13
14
15 public final static String DAY = "D";
16 public final static String BDAY = "B";
17 public final static String WEEK = "W";
18 public final static String MONTH = "M";
19 public final static String QUARTER = "Q";
20 public final static String SEMESTER = "S";
21 public final static String YEAR = "Y";
22
23 public final static String BOW = "BOW";
24 public final static String EOW = "EOW";
25
26 public final static String BOM = "BOM";
27 public final static String EOM = "EOM";
28
29 public final static String BOQ = "BOQ";
30 public final static String EOQ = "EOQ";
31
32 public final static String BOS = "BOS";
33 public final static String EOS = "EOS";
34
35 public final static String BOY = "BOY";
36 public final static String EOY = "EOY";
37
38
39 public static Calendar getBeginOfPeriod(final Date _date, final int _period) {
40 Calendar calendar = Calendar.getInstance();
41 calendar.setTime(_date);
42 calendar.set(_period, calendar.getActualMinimum(_period));
43 return calendar;
44 }
45
46 public static Calendar getEndOfPeriod(final Date _date, final int _period) {
47 Calendar calendar = Calendar.getInstance();
48 calendar.setTime(_date);
49 calendar.set(_period, calendar.getActualMaximum(_period));
50 return calendar;
51 }
52
53 public static void maximizeTime(final Calendar cal) {
54 cal.set(Calendar.AM_PM,0);
55 cal.set(Calendar.MILLISECOND,999);
56 cal.set(Calendar.SECOND,59);
57 cal.set(Calendar.MINUTE,59);
58 cal.set(Calendar.HOUR_OF_DAY,23);
59 }
60
61 public static void resetTime(final Calendar cal) {
62 cal.set(Calendar.AM_PM,0);
63 cal.set(Calendar.MILLISECOND,0);
64 cal.set(Calendar.MINUTE,0);
65 cal.set(Calendar.SECOND,0);
66 cal.set(Calendar.HOUR,0);
67 cal.set(Calendar.HOUR_OF_DAY,0);
68 }
69
70 public static Calendar getBeginOfMonth(final Date _date) {
71 Calendar cal = getBeginOfPeriod(_date, Calendar.DAY_OF_MONTH);
72 resetTime(cal);
73 return cal;
74 }
75
76 public static Calendar getEndOfMonth(final Date _date) {
77 Calendar cal = getEndOfPeriod(_date, Calendar.DAY_OF_MONTH);
78 maximizeTime(cal);
79 return cal;
80 }
81
82 public static Calendar getBeginOfWeek(final Date _date) {
83 Calendar calendar = Calendar.getInstance();
84 calendar.setTime(_date);
85 calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
86 resetTime(calendar);
87 return calendar;
88 }
89
90 public static Calendar getEndOfWeek(final Date _date) {
91 Calendar calendar = Calendar.getInstance();
92 calendar.setTime(_date);
93 calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
94 maximizeTime(calendar);
95 return calendar;
96 }
97
98 public static Calendar getBeginOfQuarter(final Date _date) {
99 Calendar calendar = Calendar.getInstance();
100 calendar.setTime(_date);
101 calendar.set(Calendar.DAY_OF_MONTH,1);
102 calendar.roll(Calendar.MONTH,-calendar.get(Calendar.MONTH)%3);
103 resetTime(calendar);
104 return calendar;
105 }
106
107 public static Calendar getEndOfQuarter(final Date _date) {
108 Calendar calendar = Calendar.getInstance();
109 calendar.setTime(_date);
110 calendar.set(Calendar.DAY_OF_MONTH,1);
111 calendar.roll(Calendar.MONTH,2-(calendar.get(Calendar.MONTH)%3));
112 calendar.set(Calendar.DAY_OF_MONTH,calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
113 maximizeTime(calendar);
114 return calendar;
115 }
116
117 public static Calendar getBeginOfSemester(final Date _date) {
118 Calendar calendar = Calendar.getInstance();
119 calendar.setTime(_date);
120 calendar.set(Calendar.DAY_OF_MONTH,1);
121 calendar.roll(Calendar.MONTH,-calendar.get(Calendar.MONTH)%6);
122 resetTime(calendar);
123 return calendar;
124 }
125
126 public static Calendar getEndOfSemester(final Date _date) {
127 Calendar calendar = Calendar.getInstance();
128 calendar.setTime(_date);
129 calendar.set(Calendar.DAY_OF_MONTH,1);
130 calendar.roll(Calendar.MONTH,5-(calendar.get(Calendar.MONTH)%6));
131 calendar.set(Calendar.DAY_OF_MONTH,calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
132 maximizeTime(calendar);
133 return calendar;
134 }
135
136 public static Calendar getBeginOfYear(final Date _date) {
137 Calendar cal = getBeginOfPeriod(_date, Calendar.DAY_OF_YEAR);
138 resetTime(cal);
139 return cal;
140 }
141
142 public static Calendar getEndOfYear(final Date _date) {
143 return getEndOfPeriod(_date, Calendar.DAY_OF_YEAR);
144 }
145
146
147
148
149
150 public static Date getToday() {
151
152 Calendar cal = Calendar.getInstance();
153 cal.setTime(new Date());
154 cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
155 return cal.getTime();
156 }
157
158 public static Integer getDayOfMonth(final Object _date) {
159 Date date = (Date) _date;
160 Calendar calendarDate = Calendar.getInstance();
161 calendarDate.setTime(date);
162 return new Integer(calendarDate.get(Calendar.DAY_OF_MONTH));
163 }
164
165 public static Calendar getEndOfDay(final Date _date) {
166 Calendar calendar = Calendar.getInstance();
167 calendar.setTime(_date);
168 calendar.set(Calendar.HOUR_OF_DAY, calendar.getActualMaximum(Calendar.HOUR_OF_DAY));
169 calendar.set(Calendar.MINUTE, calendar.getActualMaximum(Calendar.MINUTE));
170 calendar.set(Calendar.SECOND, calendar.getActualMaximum(Calendar.SECOND));
171 calendar.set(Calendar.MILLISECOND, calendar.getActualMaximum(Calendar.MILLISECOND));
172
173 return calendar;
174 }
175
176 public static Calendar getBeginOfDay(final Date _date) {
177 Calendar calendar = Calendar.getInstance();
178 calendar.setTime(_date);
179 calendar.clear(Calendar.MILLISECOND);
180 calendar.clear(Calendar.MINUTE);
181 calendar.clear(Calendar.SECOND);
182 calendar.clear(Calendar.HOUR);
183 calendar.clear(Calendar.HOUR_OF_DAY);
184 return calendar;
185 }
186
187 public static Calendar parseRelativeDate (String _relDate) {
188 Calendar date = Calendar.getInstance();
189 Pattern ptn = Pattern.compile("((-|\\+)\\d\\D|BOW|EOW|BOM|EOM|BOQ|EOQ|BOS|EOS|BOY|EOY)");
190 Matcher mtc = ptn.matcher(_relDate.toUpperCase());
191 while (mtc.find()) {
192 date = parseRelativeDate (date, mtc.group(0));
193 }
194 return date;
195 }
196
197 public static Calendar parseRelativeDate (Calendar date, String _relDate) {
198
199 String unit;
200 int count;
201
202 Pattern ptn = Pattern.compile("(-|\\+*)(\\d*)(D|W|M|Q|Y|BOW|EOW|BOM|EOM|BOQ|EOQ|BOS|EOS|BOY|EOY){1,}");
203 Matcher mtc = ptn.matcher(_relDate);
204 if (mtc.matches()) {
205 if (mtc.group(2) == null || "".equals(mtc.group(2))) {
206 count = 1;
207 } else {
208 count = Long.valueOf(mtc.group(2)).intValue();
209 }
210 if (mtc.group(1).equals("-")) {
211 count = -count;
212 }
213 unit = mtc.group(3);
214 if (DAY.equals(unit)) {
215 date.add(Calendar.DAY_OF_YEAR, count);
216 } else if (BDAY.equals(unit)) {
217 } else if (WEEK.equals(unit)) {
218 date.add(Calendar.WEEK_OF_MONTH, count);
219 } else if (MONTH.equals(unit)) {
220 date.add(Calendar.MONTH, count);
221 } else if (QUARTER.equals(unit)) {
222 date.add(Calendar.MONTH, count*3);
223 } else if (SEMESTER.equals(unit)) {
224 date.add(Calendar.MONTH, count*6);
225 } else if (YEAR.equals(unit)) {
226 date.add(Calendar.YEAR, count);
227 } else if (BOW.equals(unit)) {
228 date = getBeginOfWeek(date.getTime());
229 } else if (EOW.equals(unit)) {
230 date = getEndOfWeek(date.getTime());
231 } else if (BOM.equals(unit)) {
232 date = getBeginOfMonth(date.getTime());
233 } else if (EOM.equals(unit)) {
234 date = getEndOfMonth(date.getTime());
235 } else if (BOQ.equals(unit)) {
236 date = getBeginOfQuarter(date.getTime());
237 } else if (EOQ.equals(unit)) {
238 date = getEndOfQuarter(date.getTime());
239 } else if (BOS.equals(unit)) {
240 date = getBeginOfSemester(date.getTime());
241 } else if (EOS.equals(unit)) {
242 date = getEndOfSemester(date.getTime());
243 } else if (BOY.equals(unit)) {
244 date = getBeginOfYear(date.getTime());
245 } else if (EOY.equals(unit)) {
246 date = getEndOfYear(date.getTime());
247 }
248 } else {
249
250 }
251 return date;
252 }
253
254 }