Author: nick
Date: Mon May 5 07:40:13 2008
New Revision: 653494
URL: http://svn.apache.org/viewvc?rev=653494&view=rev
Log:
New date utils method for getting the number of days covered between two date
Modified:
commons/sandbox/me/trunk/src/org/apache/commons/me/util/DateHelper.java
commons/sandbox/me/trunk/test-src/org/apache/commons/me/util/TestDateHelper.java
Modified:
commons/sandbox/me/trunk/src/org/apache/commons/me/util/DateHelper.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/me/trunk/src/org/apache/commons/me/util/DateHelper.java?rev=653494&r1=653493&r2=653494&view=diff
==============================================================================
--- commons/sandbox/me/trunk/src/org/apache/commons/me/util/DateHelper.java
(original)
+++ commons/sandbox/me/trunk/src/org/apache/commons/me/util/DateHelper.java Mon
May 5 07:40:13 2008
@@ -45,6 +45,23 @@
c.setTime(date);
return c;
}
+
+ /**
+ * Returns a copy of the given calendar, with the date
+ * rolled backwards to midnight.
+ * Even if you give us a calendar at midnight, you'll still
+ * get a copy back
+ */
+ public static Calendar rollBackToMidnight(Calendar orig) {
+ Calendar c = Calendar.getInstance();
+ c.setTimeZone(orig.getTimeZone());
+ c.setTime(orig.getTime());
+ c.set(Calendar.HOUR_OF_DAY, 0);
+ c.set(Calendar.MINUTE, 0);
+ c.set(Calendar.SECOND, 0);
+ c.set(Calendar.MILLISECOND, 0);
+ return c;
+ }
public static Calendar fromYMD(int[] ymd) {
if(ymd.length != 3) {
@@ -128,6 +145,38 @@
return dt.toString();
}
+
+ /**
+ * Returns the number of whole days, inclusive, between
+ * two dates.
+ * Between a date and itself you get 1, between 2007-02-02
+ * and 2007-02-04 you get 3 etc.
+ */
+ public static int daysCovered(int[] startYMD, int[] endYMD) {
+ return daysCovered(fromYMD(startYMD), fromYMD(endYMD));
+ }
+ /**
+ * Returns the number of whole days, inclusive, between
+ * two dates.
+ * Between a date and itself you get 1, between 2007-02-02
+ * and 2007-02-04 you get 3 etc.
+ */
+ public static int daysCovered(Calendar start, Calendar end) {
+ // Roll both back to midnight, so it's a known point
+ long midnightStart =
rollBackToMidnight(start).getTime().getTime();
+ long midnightEnd = rollBackToMidnight(end).getTime().getTime();
+
+ // Figure out the number of days, rounding down
+ int days = (int)(
+ (midnightEnd - midnightStart) / 24.0 / 60 / 60 / 1000);
+
+ // Now add 1
+ if(days >= 0) {
+ return days + 1;
+ } else {
+ return days - 1;
+ }
+ }
/**
* Gets the date specified, in ISO date format
Modified:
commons/sandbox/me/trunk/test-src/org/apache/commons/me/util/TestDateHelper.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/me/trunk/test-src/org/apache/commons/me/util/TestDateHelper.java?rev=653494&r1=653493&r2=653494&view=diff
==============================================================================
---
commons/sandbox/me/trunk/test-src/org/apache/commons/me/util/TestDateHelper.java
(original)
+++
commons/sandbox/me/trunk/test-src/org/apache/commons/me/util/TestDateHelper.java
Mon May 5 07:40:13 2008
@@ -143,6 +143,50 @@
assertEquals(ymd[1], alt_ymd[1]);
assertEquals(ymd[2], alt_ymd[2]);
}
+
+ public void testDaysCovered() throws Exception {
+ Calendar c = Calendar.getInstance();
+ c.setTimeZone(TimeZone.getTimeZone("UTC"));
+
+ // 2009-02-13 23:31:30
+ c.setTimeInMillis(1234567890*1000l);
+ int[] y20090213 = DateHelper.toYMD(c);
+ // 2012-04-04 19:31:30
+ c.setTimeInMillis(1333567890*1000l);
+ int[] y20120404 = DateHelper.toYMD(c);
+ // 2012-04-16 09:18:10
+ c.setTimeInMillis(1334567890*1000l);
+ int[] y20120416 = DateHelper.toYMD(c);
+
+ // Date and itself gives 1
+ assertEquals(1, DateHelper.daysCovered(c, c));
+ assertEquals(1, DateHelper.daysCovered(y20120416, y20120416));
+
+ // Same year, both not at midnight
+ assertEquals(13, DateHelper.daysCovered(y20120404, y20120416));
+ assertEquals(13, DateHelper.daysCovered(
+ DateHelper.fromYMD(y20120404), c));
+ // Same year, both now at midnight
+ assertEquals(13, DateHelper.daysCovered(
+ DateHelper.fromYMD(y20120404),
DateHelper.fromYMD(y20120416)));
+
+ // Different years
+ assertEquals(365+365+366+16+31+4,
DateHelper.daysCovered(y20090213, y20120404));
+ assertEquals(365+365+366+16+31+16,
DateHelper.daysCovered(y20090213, y20120416));
+ assertEquals(365+365+366+16+31+4, DateHelper.daysCovered(
+ DateHelper.fromYMD(y20090213),
DateHelper.fromYMD(y20120404)));
+ assertEquals(365+365+366+16+31+16, DateHelper.daysCovered(
+ DateHelper.fromYMD(y20090213),
DateHelper.fromYMD(y20120416)));
+ assertEquals(365+365+366+16+31+16, DateHelper.daysCovered(
+ DateHelper.fromYMD(y20090213), c));
+
+ // Backwards
+ assertEquals(-13, DateHelper.daysCovered(
+ DateHelper.fromYMD(y20120416),
DateHelper.fromYMD(y20120404)));
+
+ // Check we haven't broken the calendars
+ assertEquals(1334567890*1000l, c.getTime().getTime());
+ }
public void testFormatTime() throws Exception {
Calendar c = DateHelper.getCalendar();