001: /*
002: * Copyright (c) 2004-2006, Jean-François Brazeau. All rights reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * 1. Redistributions of source code must retain the above copyright notice,
008: * this list of conditions and the following disclaimer.
009: *
010: * 2. Redistributions in binary form must reproduce the above copyright
011: * notice, this list of conditions and the following disclaimer in the
012: * documentation and/or other materials provided with the distribution.
013: *
014: * 3. The name of the author may not be used to endorse or promote products
015: * derived from this software without specific prior written permission.
016: *
017: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
018: * IMPLIEDWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
019: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
020: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
021: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
022: * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
023: * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
024: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
025: * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
026: * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
027: */
028: package jfb.tools.activitymgr.report;
029:
030: import java.text.ParseException;
031: import java.text.SimpleDateFormat;
032: import java.util.ArrayList;
033: import java.util.Calendar;
034: import java.util.Collections;
035: import java.util.GregorianCalendar;
036: import java.util.HashMap;
037: import java.util.Map;
038:
039: import org.apache.log4j.Logger;
040:
041: /**
042: * Classe offrant des services de manipulation de date.
043: */
044: public class DateHelper {
045:
046: /** Logger */
047: private static Logger log = Logger.getLogger(DateHelper.class);
048:
049: /** Formatteurs de date */
050: private Map dateFormats = Collections
051: .synchronizedMap(new HashMap());
052:
053: /**
054: * Retourne le formatteur de date associé à un format.
055: * @param format le format de date.
056: * @return le formatteur de date.
057: */
058: private SimpleDateFormat getDateFormat(String format) {
059: SimpleDateFormat sdf = (SimpleDateFormat) dateFormats
060: .get(format);
061: if (sdf == null) {
062: sdf = new SimpleDateFormat(format);
063: dateFormats.put(format, sdf);
064: }
065: return sdf;
066: }
067:
068: /**
069: * Convertit une chaîne de caractères au format YYYYMMDD en date.
070: * @param yyyyMMdd la date au format YYYYMMDD.
071: * @return la date convertie.
072: * @throws ParseException levé en cas de problème de format de la chaîne.
073: */
074: public Calendar toDate(String yyyyMMdd) throws ParseException {
075: return toDate("yyyyMMdd", yyyyMMdd);
076: }
077:
078: /**
079: * Convertit une chaîne de caractères au format spécifié en date.
080: * @param format le format de date.
081: * @param date la chapine de caractères.
082: * @return la date convertie.
083: * @throws ParseException levé en cas de problème de format de la chaîne.
084: */
085: public Calendar toDate(String format, String date)
086: throws ParseException {
087: Calendar _date = new GregorianCalendar();
088: _date.setTime(getDateFormat(format).parse(date));
089: log.debug("toDate(" + format + ", " + date + ")=" + _date);
090: return _date;
091: }
092:
093: /**
094: * Convertit une date au format spécifié.
095: * @param format le format de date.
096: * @param date la date à convertir.
097: * @return la date convertie.
098: */
099: public String toString(String format, Calendar date) {
100: return getDateFormat(format).format(date.getTime());
101: }
102:
103: /**
104: * Convertit une date au format YYYYMMDD.
105: * @param date la date à convertir.
106: * @return la date convertie.
107: */
108: public String toYYYYMMDD(Calendar date) {
109: return toString("yyyyMMdd", date);
110: }
111:
112: /**
113: * Retourne l'année associée à une date.
114: * @param date la date.
115: * @return l'année.
116: */
117: public Integer getYear(Calendar date) {
118: log.debug("getYear()");
119: return new Integer(date.get(Calendar.YEAR));
120: }
121:
122: /**
123: * Retourne le mois associé à une date.
124: * @param date la date.
125: * @return le mois.
126: */
127: public Integer getMonth(Calendar date) {
128: log.debug("getMonth()");
129: return new Integer(date.get(Calendar.MONTH) + 1);
130: }
131:
132: /**
133: * Retourne le jour associé à une date.
134: * @param date la date.
135: * @return le jour.
136: */
137: public Integer getDay(Calendar date) {
138: log.debug("getDay()");
139: return new Integer(date.get(Calendar.DATE));
140: }
141:
142: /**
143: * Construit un interval de dates entre deux dates spécifiées dont la
144: * granularité est le jour.
145: * @param fromDate date de départ de l'interval.
146: * @param toDate date de fin de l'interval.
147: * @return l'interval de dates.
148: */
149: public static Calendar[] buildDayInterval(Calendar fromDate,
150: Calendar toDate) {
151: return buildInterval(fromDate, toDate, Calendar.DATE);
152: }
153:
154: /**
155: * Construit un interval de dates entre deux dates spécifiées dont la
156: * granularité est le mois.
157: * @param fromDate date de départ de l'interval.
158: * @param toDate date de fin de l'interval.
159: * @return l'interval de dates.
160: */
161: public static Calendar[] buildMonthInterval(Calendar fromDate,
162: Calendar toDate) {
163: return buildInterval(fromDate, toDate, Calendar.MONTH);
164: }
165:
166: /**
167: * Construit un interval de dates entre deux dates spécifiées dont la
168: * granularité est spécifiée en paramètre.
169: * @param fromDate date de départ de l'interval.
170: * @param toDate date de fin de l'interval.
171: * @param dateIncrementType granularité de l'interval.
172: * @return l'interval de dates.
173: */
174: private static Calendar[] buildInterval(Calendar fromDate,
175: Calendar toDate, int dateIncrementType) {
176: log.debug("buildInterval(" + fromDate + ", " + toDate + ")");
177: if (dateIncrementType != Calendar.DATE
178: && dateIncrementType != Calendar.MONTH)
179: throw new Error("Date increment type not supported");
180: ArrayList list = new ArrayList();
181: Calendar cal = (Calendar) toDate.clone();
182: cal.add(dateIncrementType, 1);
183: if (dateIncrementType == Calendar.MONTH)
184: cal.add(Calendar.DATE, -1);
185: long toDateInMillis = cal.getTimeInMillis();
186: cal = (Calendar) fromDate.clone();
187: while (cal.getTimeInMillis() < toDateInMillis) {
188: list.add(cal.clone());
189: cal.add(dateIncrementType, 1);
190: }
191: return (Calendar[]) list.toArray(new Calendar[list.size()]);
192: }
193:
194: /**
195: * Retourne le dernier jour du mois de la date spécifiée.
196: * @param date la date associé au mois dont on veut connaître le dernier jour.
197: * @return le dernier jour du mois.
198: */
199: public Calendar lastDayInMonth(Calendar date) {
200: Calendar lastMonthDate = (Calendar) date.clone();
201: lastMonthDate.add(Calendar.MONTH, 1);
202: lastMonthDate.add(Calendar.DATE, -1);
203: return lastMonthDate;
204: }
205:
206: }
|