View Javadoc

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  	 * Constants for Date Operations
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 	 * @return Today Date with hour set to 00:00:00.0
148 	 * @throws ParseException
149 	 */
150 	public static Date getToday()  {
151 		// Date today = new Date();
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 //		String strCount;
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 }