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


Reply via email to