Author: fdesbois Date: 2010-02-26 14:12:42 +0100 (Fri, 26 Feb 2010) New Revision: 1775 Modified: trunk/src/main/java/org/nuiton/util/DateUtils.java trunk/src/main/java/org/nuiton/util/PeriodDates.java trunk/src/test/java/org/nuiton/util/DateUtilsTest.java Log: [DateUtils - PeriodDates] - Refactor new GregorianCalendar() by using Calendar.getInstance(). - Add getDifferenceInMonths method - Improve javadoc - Add comparison methods for PeriodDates with Date parameter Modified: trunk/src/main/java/org/nuiton/util/DateUtils.java =================================================================== --- trunk/src/main/java/org/nuiton/util/DateUtils.java 2010-02-25 10:27:43 UTC (rev 1774) +++ trunk/src/main/java/org/nuiton/util/DateUtils.java 2010-02-26 13:12:42 UTC (rev 1775) @@ -24,7 +24,6 @@ import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; -import java.util.GregorianCalendar; import java.util.Locale; /** @@ -45,6 +44,7 @@ /** * Format a date using the pattern in argument. The pattern is the same using * for DateFormat object. + * * @param date the date to format * @param pattern the pattern to use * @return a String corresponding to the date formatted @@ -63,6 +63,7 @@ /** * Parse a date using the pattern in argument. The pattern is the same using * for DateFormat object. + * * @param date the String to parse * @param pattern the pattern to use * @return a Date corresponding to the String argument parsed @@ -77,28 +78,33 @@ /** * Create a new date from day, month and year (French version). - * The month is the real month of the year and not the one which is stored in Calendar object. * + * The month is the real month of the year and not the one which is stored + * in Calendar object. + * * @param dd value of the day 1-31 * @param mm value of the month 1-12 * @param yy value of the year 0-9999 * @return a new date */ public static Date createDate(int dd, int mm, int yy) { - Calendar calendar = new GregorianCalendar(yy,mm-1,dd); + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.YEAR, yy); + calendar.set(Calendar.MONTH, mm-1); + calendar.set(Calendar.DAY_OF_MONTH, dd); return calendar.getTime(); } /** * Create a new date after the current date (today) with modification on day, month and year. * You can use negative values on arguments to have a date before today. + * * @param ddStep nb days you want to increase from the current date * @param mmStep nb months you want to increase from the current date * @param yyStep nb years you want to increase from the current date * @return a new date from the current date increase by days, months and years. */ public static Date createDateAfterToday(int ddStep, int mmStep, int yyStep) { - Calendar calendar = new GregorianCalendar(); - calendar.setTime(new Date()); + Calendar calendar = getDefaultCalendar(new Date()); calendar.add(Calendar.DAY_OF_MONTH, ddStep); calendar.add(Calendar.MONTH,mmStep); calendar.add(Calendar.YEAR, yyStep); @@ -108,12 +114,12 @@ /** * Set the last day of month to the date in argument. * The value depends on the month of the date. (30 april, 28 february, ...) + * * @param date Date to modify * @return the date with day of month modified */ public static Date setLastDayOfMonth(Date date) { - Calendar calendar = new GregorianCalendar(); - calendar.setTime(date); + Calendar calendar = getDefaultCalendar(date); int maximum = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); calendar.set(Calendar.DAY_OF_MONTH, maximum); return calendar.getTime(); @@ -121,19 +127,53 @@ /** * Set the first day of month to the date in argument. + * * @param date Date to modify * @return the date with day of month modified */ public static Date setFirstDayOfMonth(Date date) { - Calendar calendar = new GregorianCalendar(); - calendar.setTime(date); + Calendar calendar = getDefaultCalendar(date); calendar.set(Calendar.DAY_OF_MONTH, 1); return calendar.getTime(); } /** - * Check if the first date in argument is included between the two other dates. - * The argument myDate can be equals to beforeDate or afterDate to validate the includes. + * Set the min time of the day : 00:00:00.000. + * + * @param date to modify + * @return Date with the time set to the minimum in the day + */ + public static Date setMinTimeOfDay(Date date) { + Calendar calendar = getDefaultCalendar(date); + calendar.set(Calendar.AM_PM, Calendar.AM); + calendar.set(Calendar.HOUR, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + return calendar.getTime(); + } + + /** + * Set the max time of the day. EUROPE : 23:59:59.999. + * + * @param date to modify + * @return Date with the time set to the maximum in the day + */ + public static Date setMaxTimeOfDay(Date date) { + Calendar calendar = getDefaultCalendar(date); + calendar.set(Calendar.AM_PM, Calendar.PM); + calendar.set(Calendar.HOUR, 11); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + calendar.set(Calendar.MILLISECOND, 999); + return calendar.getTime(); + } + + /** + * Check if the first date in argument is included between the two other + * dates. The argument myDate can be equals to beforeDate or afterDate to + * validate the includes. + * * @param myDate the date to test * @param beforeDate the first date of the period to test * @param afterDate the second date of the period to test @@ -151,9 +191,11 @@ /** * Check if the current date is between the two dates in argument. + * * @param beforeDate the first date of the period * @param afterDate the second date of the period - * @return true if the current date is included between the two dates, false either + * @return true if the current date is included between the two dates, + * false otherwise * @see #between(java.util.Date, java.util.Date, java.util.Date) */ public static boolean currentPeriod(Date beforeDate, Date afterDate) { @@ -162,12 +204,12 @@ /** * Get the month value from a date (between 0 and 11). + * * @param date the date to extract month * @return the month value of the date */ public static int getMonth(Date date) { - Calendar calendar = new GregorianCalendar(); - calendar.setTime(date); + Calendar calendar = getDefaultCalendar(date); return calendar.get(Calendar.MONTH); } @@ -175,6 +217,7 @@ * Do the difference between the two dates in argument. The result is a number * of days between the two dates. * Ex : 28/01/2009 and 08/02/2009 return 11. + * * @param beginDate first date * @param endDate second date * @return a number of days between beginDate and endDate @@ -187,7 +230,30 @@ } /** + * Do the difference between the two dates in argument. The result is a number + * of months between the two dates. + * Ex : 01/01/2009 and 28/02/2009 return 2 months. + * Warning, if beginDate is inferior to endDate, the result will be 1 minimum + * + * @param beginDate first date + * @param endDate second date + * @return a number of months between beginDate and endDate + */ + public static int getDifferenceInMonths(Date beginDate, Date endDate) { + int count = 0; + Calendar fromCalendar = getDefaultCalendar(beginDate); + Calendar thruCalendar = getDefaultCalendar(endDate); + + while (fromCalendar.before(thruCalendar)) { + fromCalendar.add(Calendar.MONTH, 1); + count++; + } + return count; + } + + /** * Get libelle of the month corresponding to the number given in argument. + * * @param monthNumber between 1-12 * @param locale Locale for language support * @return a String corresponding to the libelle of the month @@ -198,6 +264,7 @@ /** * Get libelle of the month corresponding to the number given in argument. + * * @param monthNumber between 1-12 * @return a String corresponding to the libelle of the month */ @@ -205,4 +272,17 @@ return getMonthLibelle(monthNumber, Locale.getDefault()); } + /** + * Get the calendar corresponding to the {@code date}. The default calendar + * will be returned (default time zone and locale). + * + * @param date used to set the calendar time + * @return the default calendar with time corresponding to the {@code date} + */ + public static Calendar getDefaultCalendar(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + return calendar; + } + } Modified: trunk/src/main/java/org/nuiton/util/PeriodDates.java =================================================================== --- trunk/src/main/java/org/nuiton/util/PeriodDates.java 2010-02-25 10:27:43 UTC (rev 1774) +++ trunk/src/main/java/org/nuiton/util/PeriodDates.java 2010-02-26 13:12:42 UTC (rev 1775) @@ -77,7 +77,8 @@ /** * Create a period from the date of today. If monthAfter is negative, the current day will be * the thruDate of the period. The period extremities will be initialized (first day of month for - * fromDate and last day of month for thruDate) + * fromDate and last day of month for thruDate). Time is set to 0 for both + * dates. * <pre> * Ex 1 : * Today = 12/05/2009 @@ -93,19 +94,13 @@ * @return a new PeriodDates */ public static PeriodDates createMonthsPeriodFromToday(int monthAfter) { - Calendar calendarFrom = new GregorianCalendar(); - Calendar calendarThru = new GregorianCalendar(); + Calendar calendarFrom = Calendar.getInstance(); + Calendar calendarThru = Calendar.getInstance(); -// calendarFrom.set(Calendar.DAY_OF_MONTH, 1); -// - // Reset time - calendarFrom.set(Calendar.AM_PM, Calendar.AM); - calendarFrom.set(Calendar.HOUR, 0); - calendarFrom.set(Calendar.MINUTE, 0); - calendarFrom.set(Calendar.SECOND, 0); - calendarFrom.set(Calendar.MILLISECOND, 0); - calendarThru.setTime(calendarFrom.getTime()); + Date minTime = DateUtils.setMinTimeOfDay(new Date()); + calendarFrom.setTime(minTime); + calendarThru.setTime(minTime); if (monthAfter < 0) { calendarFrom.add(Calendar.MONTH, monthAfter); @@ -113,12 +108,6 @@ calendarThru.add(Calendar.MONTH, monthAfter); } - -// calendarThru.setTime(calendarFrom.getTime()); - -// int maximum = calendarThru.getActualMaximum(Calendar.DAY_OF_MONTH); -// calendarThru.set(Calendar.DAY_OF_MONTH, maximum); - PeriodDates period = new PeriodDates(calendarFrom, calendarThru); period.initDayOfMonthExtremities(); period.setPattern(DateUtils.MONTH_PATTERN); @@ -150,7 +139,7 @@ //this.fromDate = fromDate; if (fromDate != null) { if (fromCalendar == null) { - fromCalendar = new GregorianCalendar(); + fromCalendar = Calendar.getInstance(); } fromCalendar.setTime(fromDate); } else { @@ -170,7 +159,7 @@ //this.thruDate = thruDate; if (thruDate != null) { if (thruCalendar == null) { - thruCalendar = new GregorianCalendar(); + thruCalendar = Calendar.getInstance(); } thruCalendar.setTime(thruDate); } else { @@ -225,13 +214,34 @@ public boolean between(Calendar calendar) { return beforeEnd(calendar) && afterBegin(calendar); } + + public boolean beforeEnd(Date date) { + Calendar calendar = DateUtils.getDefaultCalendar(date); + return beforeEnd(calendar); + } + + public boolean afterEnd(Date date) { + Calendar calendar = DateUtils.getDefaultCalendar(date); + return afterEnd(calendar); + } + + public boolean afterBegin(Date date) { + Calendar calendar = DateUtils.getDefaultCalendar(date); + return afterBegin(calendar); + } + + public boolean between(Date date) { + Calendar calendar = DateUtils.getDefaultCalendar(date); + return between(calendar); + } @Override public String toString() { String fromStr = DateUtils.formatDate(getFromDate(), pattern); String thruStr = DateUtils.formatDate(getThruDate(), pattern); - return "[ " + getFromDate() + " (pattern: " + fromStr + ") -> " + getThruDate() + " (pattern: " + thruStr + ") ]"; + return "[ " + getFromDate() + " (pattern: " + fromStr + ") -> " + + getThruDate() + " (pattern: " + thruStr + ") ]"; } } Modified: trunk/src/test/java/org/nuiton/util/DateUtilsTest.java =================================================================== --- trunk/src/test/java/org/nuiton/util/DateUtilsTest.java 2010-02-25 10:27:43 UTC (rev 1774) +++ trunk/src/test/java/org/nuiton/util/DateUtilsTest.java 2010-02-26 13:12:42 UTC (rev 1775) @@ -125,6 +125,32 @@ } @Test + public void testGetDifferenceInMonths() { + System.out.println("getDifferenceInMonths"); + + Date beginDate = DateUtils.createDate(3, 2, 2009); + Date endDate = DateUtils.createDate(8, 8, 2010); + + int result = DateUtils.getDifferenceInMonths(beginDate, endDate); + System.out.println("result1 : " + result); + Assert.assertEquals(19, result); + + beginDate = DateUtils.createDate(1, 1, 2009); + endDate = DateUtils.createDate(28, 2, 2009); + + result = DateUtils.getDifferenceInMonths(beginDate, endDate); + System.out.println("result2 : " + result); + Assert.assertEquals(2, result); + + beginDate = DateUtils.createDate(31, 1, 2009); + endDate = DateUtils.createDate(1, 2, 2009); + + result = DateUtils.getDifferenceInMonths(beginDate, endDate); + System.out.println("result3 : " + result); + Assert.assertEquals(1, result); + } + + @Test public void testGetMonthLibelle() { System.out.println("getMonthLibelle");