Author: nick
Date: Tue Apr 15 17:21:53 2008
New Revision: 648464

URL: http://svn.apache.org/viewvc?rev=648464&view=rev
Log:
Date related helpers

Added:
    commons/sandbox/me/trunk/src/org/apache/commons/me/util/DateHelper.java   
(with props)
    
commons/sandbox/me/trunk/test-src/org/apache/commons/me/util/TestDateHelper.java
   (with props)

Added: 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=648464&view=auto
==============================================================================
--- commons/sandbox/me/trunk/src/org/apache/commons/me/util/DateHelper.java 
(added)
+++ commons/sandbox/me/trunk/src/org/apache/commons/me/util/DateHelper.java Tue 
Apr 15 17:21:53 2008
@@ -0,0 +1,200 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+package org.apache.commons.me.util;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+/**
+ * Various date related helper functions.
+ * In the interests of sanity, will normally work just in UTC,
+ *  but that can be tweaked if required.
+ */
+public class DateHelper {
+       private static TimeZone timeZone = TimeZone.getTimeZone("UTC");
+       /**
+        * Sets the TimeZone to work in, when converting Date
+        *  objects into Calendars, and on into Strings
+        */
+       public static void setTimeZone(TimeZone tz) {
+               timeZone = tz;
+       }
+       
+       public static Calendar getCalendar() {
+               Calendar c = Calendar.getInstance();
+               c.setTimeZone(timeZone);
+               return c;
+       }
+       public static Calendar getCalendar(Date date) {
+               Calendar c = getCalendar();
+               c.setTime(date);
+               return c;
+       }
+       
+       public static Calendar fromYMD(int[] ymd) {
+               if(ymd.length != 3) {
+                       throw new IllegalArgumentException("ymd must be of the 
form {year,month,day}");
+               }
+               return fromYMD(ymd[0], ymd[1], ymd[2]);
+       }
+       public static Calendar fromYMD(int year, int month, int day) {
+               Calendar c = getCalendar();
+               c.set(Calendar.YEAR, year);
+               c.set(Calendar.MONTH, (month-1)); // 0 based!
+               c.set(Calendar.DAY_OF_MONTH, day);
+               // Set the rest to zero
+               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 int[] toYMD(Calendar c) {
+               return new int[] {
+                               c.get(Calendar.YEAR),
+                               c.get(Calendar.MONTH) + 1, // 0 based!
+                               c.get(Calendar.DAY_OF_MONTH)
+               };
+       }
+       
+       /**
+        * Convenience function for getting yy/mm/dd relative 
+        *  to today, offset by 'days'.
+        * @param daysHence Number of days hence to return YMD for
+        */
+       public static int[] toYMD(int daysHence) {
+               // Calculate the time at that point, staying as a long
+               //  so don't get any int wrapping problems
+               long then = System.currentTimeMillis() + 
(daysHence*24l*60*60*1000);
+               // Now turn that into a calendar, then into YMD
+               Calendar c = getCalendar( new Date(then) );
+               return toYMD(c);
+       }
+
+       
+       public static String asISODate(Date d) {
+               Calendar c = getCalendar();
+               c.setTime(d);
+               return asISODate(c);
+       }
+       private static String asISODate(Calendar c) {
+               StringBuffer date = new StringBuffer();
+               
+               date.append( c.get(Calendar.YEAR) );
+               
+               date.append("-");
+               int month = c.get(Calendar.MONTH)+1; // 0 based!
+               if(month < 10) { date.append("0"); }
+               date.append(month);
+               
+               date.append("-");
+               int day = c.get(Calendar.DAY_OF_MONTH);
+               if(day < 10)  { date.append("0"); }
+               date.append(day);
+               
+               return date.toString();
+       }
+       public static String asISODateTime(Date d) {
+               Calendar c = getCalendar();
+               c.setTime(d);
+               
+               StringBuffer dt = new StringBuffer();
+               dt.append( asISODate(c) );
+               dt.append(" ");
+               
+               int hour = c.get(Calendar.HOUR_OF_DAY);
+               int minute = c.get(Calendar.MINUTE);
+               if(hour < 10) { dt.append("0"); }
+               dt.append(hour);
+               dt.append(":");
+               if(minute < 10) { dt.append("0"); }
+               dt.append(minute);
+               
+               return dt.toString();
+       }
+       
+       /**
+        * Gets the date specified, in ISO date format
+        */
+       public static String asIsoDate(int[] ymd) {
+               if(ymd.length != 3) {
+                       throw new IllegalArgumentException("Must be of the form 
{year,month,day}");
+               }
+               return asIsoDate(ymd[0], ymd[1], ymd[2]);
+       }
+       /**
+        * Gets the date specified, in ISO date format
+        */
+       public static String asIsoDate(int year, int month, int day) {
+               StringBuffer d = new StringBuffer();
+               d.append(year);
+               d.append("-");
+               if(month < 10) {
+                       d.append("0");
+               }
+               d.append(month);
+               d.append("-");
+               if(day < 10) {
+                       d.append("0");
+               }
+               d.append(day);
+               
+               return d.toString();
+       }
+       /**
+        * Turns an ISO date formatted date string into
+        *  [year,month,day]
+        */
+       public static int[] fromIsoString(String s) {
+               String yS = s.substring(0, s.indexOf("-"));
+               String mdS = s.substring(s.indexOf("-") + 1);
+               String mS = mdS.substring(0, mdS.indexOf("-"));
+               String dS = mdS.substring(mdS.indexOf("-")+1);
+               return new int[] {
+                               Integer.parseInt(yS),
+                               Integer.parseInt(mS),
+                               Integer.parseInt(dS)
+               };
+       }
+
+       public static String asHhMm(Date d) {
+               Calendar c = getCalendar(d);
+               StringBuffer dt = new StringBuffer();
+
+               int hour = c.get(Calendar.HOUR_OF_DAY);
+               int minute = c.get(Calendar.MINUTE);
+               
+               // Turn into 12 hour clock no matter what
+               int h = hour;
+               if(hour > 12)
+                       h -= 12;
+               dt.append(h);
+               dt.append(":");
+               
+               if(minute < 10) { dt.append("0"); }
+               dt.append(minute);
+
+               if(c.get(Calendar.AM_PM) == Calendar.AM) {
+                       dt.append("am");
+               } else {
+                       dt.append("pm");
+               }
+               return dt.toString();
+       }
+}

Propchange: 
commons/sandbox/me/trunk/src/org/apache/commons/me/util/DateHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
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=648464&view=auto
==============================================================================
--- 
commons/sandbox/me/trunk/test-src/org/apache/commons/me/util/TestDateHelper.java
 (added)
+++ 
commons/sandbox/me/trunk/test-src/org/apache/commons/me/util/TestDateHelper.java
 Tue Apr 15 17:21:53 2008
@@ -0,0 +1,166 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+package org.apache.commons.me.util;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+import junit.framework.TestCase;
+
+/**
+ * Tests for the Date Helper functions
+ */
+public class TestDateHelper extends TestCase {
+       public void testIsoDate() throws Exception {
+               Date d;
+               
+               // 2009-02-13 23:31:30
+               d = new Date(1234567890*1000l);
+               assertEquals("2009-02-13", DateHelper.asISODate(d));
+               assertEquals("2009-02-13 23:31", DateHelper.asISODateTime(d));
+               
+               // 2012-04-16 09:18:10
+               d = new Date(1334567890*1000l);
+               assertEquals("2012-04-16", DateHelper.asISODate(d));
+               assertEquals("2012-04-16 09:18", DateHelper.asISODateTime(d));
+               
+               // 2012-04-04 19:31:30
+               d = new Date(1333567890*1000l);
+               assertEquals("2012-04-04", DateHelper.asISODate(d));
+               assertEquals("2012-04-04 19:31", DateHelper.asISODateTime(d));
+               
+               // 2012-04-02 02:03:40
+               d = new Date(1333332220*1000l);
+               assertEquals("2012-04-02", DateHelper.asISODate(d));
+               assertEquals("2012-04-02 02:03", DateHelper.asISODateTime(d));
+       }
+       
+       public void testIsoDateYMD() throws Exception {
+               int[] ymd;
+               
+               assertEquals("2007-01-02", DateHelper.asIsoDate(2007,01,02));
+               assertEquals("2007-01-02", DateHelper.asIsoDate(new 
int[]{2007,01,02}));
+               
+               assertEquals("2007-11-02", DateHelper.asIsoDate(2007,11,02));
+               assertEquals("2007-11-02", DateHelper.asIsoDate(new 
int[]{2007,11,02}));
+               
+               assertEquals("2007-11-30", DateHelper.asIsoDate(2007,11,30));
+               assertEquals("2007-11-30", DateHelper.asIsoDate(new 
int[]{2007,11,30}));
+               
+               ymd = DateHelper.fromIsoString("2007-11-30");
+               assertEquals(2007, ymd[0]);
+               assertEquals(11, ymd[1]);
+               assertEquals(30, ymd[2]);
+               
+               ymd = DateHelper.fromIsoString("2001-01-04");
+               assertEquals(2001, ymd[0]);
+               assertEquals(1, ymd[1]);
+               assertEquals(4, ymd[2]);
+               
+               ymd = DateHelper.fromIsoString("2001-1-4");
+               assertEquals(2001, ymd[0]);
+               assertEquals(1, ymd[1]);
+               assertEquals(4, ymd[2]);
+       }
+
+       /**
+        * Test these in python:
+        *   import datetime
+        *   datetime.datetime.fromtimestamp(1234569600)
+        */
+       public void testYMDToCal() throws Exception {
+               Calendar c;
+               
+               // 1234567890 = 2009-02-13 23:31:30
+               c = DateHelper.fromYMD(new int[] {2009,2,14});
+               assertEquals(1234569600 * 1000l, c.getTimeInMillis());
+               
+               // 1334567890 = 2012-04-16 09:18:10
+               c = DateHelper.fromYMD(new int[] {2012,4,17});
+               assertEquals(1334620800 * 1000l, c.getTimeInMillis());
+               
+               // 1333567890 = 2012-04-04 19:31:30
+               c = DateHelper.fromYMD(new int[] {2012,4,5});
+               assertEquals(1333584000 * 1000l, c.getTimeInMillis());
+               
+               // 1333332220 = 2012-04-02 02:03:40
+               c = DateHelper.fromYMD(new int[] {2012,4,3});
+               assertEquals(1333411200 * 1000l, c.getTimeInMillis());
+       }
+       
+       public void testCalToYMD() throws Exception {
+               Calendar c = Calendar.getInstance();
+               c.setTimeZone(TimeZone.getTimeZone("UTC"));
+               int[] ymd;
+               
+               // 2009-02-13 23:31:30
+               c.setTimeInMillis(1234567890*1000l);
+               ymd = DateHelper.toYMD(c);
+               assertEquals(2009, ymd[0]);
+               assertEquals(2, ymd[1]);
+               assertEquals(13, ymd[2]);
+               
+               // 2012-04-16 09:18:10
+               c.setTimeInMillis(1334567890*1000l);
+               ymd = DateHelper.toYMD(c);
+               assertEquals(2012, ymd[0]);
+               assertEquals(4, ymd[1]);
+               assertEquals(16, ymd[2]);
+               
+               // 2012-04-04 19:31:30
+               c.setTimeInMillis(1333567890*1000l);
+               ymd = DateHelper.toYMD(c);
+               assertEquals(2012, ymd[0]);
+               assertEquals(4, ymd[1]);
+               assertEquals(4, ymd[2]);
+               
+               // 2012-04-02 02:03:40
+               c.setTimeInMillis(1333332220*1000l);
+               ymd = DateHelper.toYMD(c);
+               assertEquals(2012, ymd[0]);
+               assertEquals(4, ymd[1]);
+               assertEquals(2, ymd[2]);
+               
+               // Check via days hence
+               int[] alt_ymd = DateHelper.toYMD(0);
+               ymd = DateHelper.toYMD(DateHelper.getCalendar());
+               assertEquals(ymd[0], alt_ymd[0]);
+               assertEquals(ymd[1], alt_ymd[1]);
+               assertEquals(ymd[2], alt_ymd[2]);
+       }
+       
+       public void testFormatTime() throws Exception {
+               Calendar c = DateHelper.getCalendar();
+               
+               // 2009-02-13 23:31:30
+               c.setTimeInMillis(1234567890*1000l);
+               assertEquals("11:31pm", DateHelper.asHhMm(c.getTime()));
+               
+               // 2012-04-16 09:18:10
+               c.setTimeInMillis(1334567890*1000l);
+               assertEquals("9:18am", DateHelper.asHhMm(c.getTime()));
+               
+               // 2012-04-04 19:31:30
+               c.setTimeInMillis(1333567890*1000l);
+               assertEquals("7:31pm", DateHelper.asHhMm(c.getTime()));
+               
+               // 2012-04-02 02:03:40
+               c.setTimeInMillis(1333332220*1000l);
+               assertEquals("2:03am", DateHelper.asHhMm(c.getTime()));
+       }
+}

Propchange: 
commons/sandbox/me/trunk/test-src/org/apache/commons/me/util/TestDateHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to