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");