1
2 package com.pnpconsult.zeiterfassung.util;
3
4 import java.text.DateFormat;
5 import java.text.ParseException;
6 import java.text.SimpleDateFormat;
7 import java.util.ArrayList;
8 import java.util.Calendar;
9 import java.util.Collection;
10 import java.util.Date;
11
12 import org.apache.commons.lang.StringUtils;
13 import org.apache.commons.logging.Log;
14 import org.apache.commons.logging.LogFactory;
15 import org.apache.struts.util.LabelValueBean;
16
17 /***
18 * @author <a href="mailto:powerpete@users.sf.net">M. Petersen </a>
19 * @version $Id: DateUtils.java,v 1.9 2004/07/22 08:41:28 powerpete Exp $
20 */
21 public class DateUtils
22 {
23 private static final Log LOG = LogFactory.getLog(DateUtils.class);
24 public static final String NO_LABEL = "--";
25 public static final String NO_VALUE = "-1";
26 public static final int NO_CHANGE = 0;
27 public static final int FIRST = 1;
28 public static final int LAST = 2;
29 private static final DateFormat FORMAT = DateFormat.getDateInstance(DateFormat.MEDIUM);
30 private static final DateFormat MONTH_FORMAT = new SimpleDateFormat("MMMM");
31 private static final DateFormat MONTH_YEAR_FORMAT = new SimpleDateFormat(
32 "MMMM yyyy");
33 private static final Date REALLY_OLD = createReallyOld();
34
35 private static final Date createReallyOld()
36 {
37 try
38 {
39 return parse("31.12.9999");
40 }
41 catch (ParseException e)
42 {
43 LOG.fatal(e.getMessage(), e);
44 return null;
45 }
46 }
47
48 private DateUtils()
49 {}
50
51 public static String format(Date date)
52 {
53 if (date == null)
54 {
55 return "";
56 }
57 return FORMAT.format(date);
58 }
59
60 public static Date parse(String str) throws ParseException
61 {
62 if (StringUtils.isEmpty(str))
63 {
64 return null;
65 }
66 return correctDate(FORMAT.parse(str));
67 }
68
69 public static Collection monthCollection()
70 {
71 Collection months = new ArrayList(13);
72 months.add(new LabelValueBean(NO_LABEL, NO_VALUE));
73 Calendar cal = Calendar.getInstance();
74 cal.clear();
75 for (int i = Calendar.JANUARY; i <= Calendar.DECEMBER; i++)
76 {
77 cal.set(Calendar.MONTH, i);
78 String month = MONTH_FORMAT.format(cal.getTime());
79 months.add(new LabelValueBean(month, String.valueOf(i)));
80 }
81 return months;
82 }
83
84 public static Collection yearCollection(
85 Date currentDate,
86 int yearsBefore,
87 int yearsAfter)
88 {
89 Collection years = new ArrayList(yearsBefore + 1 + yearsAfter);
90 Calendar calendar = Calendar.getInstance();
91 calendar.setTime(currentDate);
92 int currentYear = calendar.get(Calendar.YEAR);
93 years.add(new LabelValueBean(NO_LABEL, NO_VALUE));
94 for (int i = currentYear - yearsBefore; i < currentYear + yearsAfter; i++)
95 {
96 String year = String.valueOf(i);
97 years.add(new LabelValueBean(year, year));
98 }
99 return years;
100 }
101
102 public static Date toFirst(Date date)
103 {
104 return changeDay(date, FIRST);
105 }
106
107 public static Date toLast(Date date)
108 {
109 return changeDay(date, LAST);
110 }
111
112 private static Date correctDate(Date date)
113 {
114 Calendar c = Calendar.getInstance();
115 c.setTime(date);
116 if (c.get(Calendar.YEAR) < 2000)
117 {
118 c.add(Calendar.YEAR, 2000);
119 }
120 return c.getTime();
121 }
122
123 private static Date changeDay(Date date, int mode)
124 {
125 if (date == null)
126 {
127 return null;
128 }
129 Calendar calendar = Calendar.getInstance();
130 calendar.setTime(date);
131 setCalendarValue(calendar, Calendar.DAY_OF_MONTH, mode);
132 return calendar.getTime();
133 }
134
135 private static void setCalendarValue(Calendar calendar, int field, int mode)
136 {
137 switch (mode)
138 {
139 case FIRST:
140 calendar.set(field, calendar.getActualMinimum(field));
141 break;
142 case LAST:
143 calendar.set(field, calendar.getActualMaximum(field));
144 break;
145 }
146 }
147
148 public static String formatWithoutDay(Date date)
149 {
150 return MONTH_YEAR_FORMAT.format(date);
151 }
152
153 public static Date max(Date date1, Date date2)
154 {
155 if (date1 == null)
156 {
157 return date2;
158 }
159 if (date2 == null)
160 {
161 return date1;
162 }
163 return date1.after(date2) ? date1 : date2;
164 }
165
166 public static Date min(Date date1, Date date2)
167 {
168 if (date1 == null)
169 {
170 return date2;
171 }
172 if (date2 == null)
173 {
174 return date1;
175 }
176 return date1.before(date2) ? date1 : date2;
177 }
178
179 public static Date firstOfMonth(Date date)
180 {
181 Calendar cal = Calendar.getInstance();
182 cal.setTime(date);
183 cal.set(Calendar.DAY_OF_MONTH, 1);
184 cal.set(Calendar.HOUR, 0);
185 cal.set(Calendar.MINUTE, 0);
186 cal.set(Calendar.SECOND, 0);
187 cal.set(Calendar.MILLISECOND, 0);
188 return cal.getTime();
189 }
190
191 public static boolean equalsMonth(Date d1, Date d2)
192 {
193 if (d1 == null)
194 {
195 return d2 == null;
196 }
197 if (d2 == null)
198 {
199 return d1 == null;
200 }
201 Calendar c1 = Calendar.getInstance();
202 c1.setTime(d1);
203 Calendar c2 = Calendar.getInstance();
204 c2.setTime(d2);
205 return c1.get(Calendar.MONTH) == c2.get(Calendar.MONTH)
206 && c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR);
207 }
208
209 public static Date createDate(int billingMonth, int billingYear)
210 {
211 if (billingMonth == -1 || billingYear == -1)
212 {
213 return null;
214 }
215 Calendar cal = Calendar.getInstance();
216 cal.clear();
217 cal.set(Calendar.MONTH, billingMonth);
218 cal.set(Calendar.YEAR, billingYear);
219 return cal.getTime();
220 }
221
222 public static Date convertNullToReallyOld(Date date)
223 {
224 if (date == null)
225 {
226 return REALLY_OLD;
227 }
228 return date;
229 }
230 }