Home » commons-lang-2.4-src » org.apache.commons » lang » time » [javadoc | source]
    1   /*
    2    * Copyright 2002-2005 The Apache Software Foundation.
    3    * 
    4    * Licensed under the Apache License, Version 2.0 (the "License");
    5    * you may not use this file except in compliance with the License.
    6    * You may obtain a copy of the License at
    7    * 
    8    *      http://www.apache.org/licenses/LICENSE-2.0
    9    * 
   10    * Unless required by applicable law or agreed to in writing, software
   11    * distributed under the License is distributed on an "AS IS" BASIS,
   12    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   13    * See the License for the specific language governing permissions and
   14    * limitations under the License.
   15    */
   16   package org.apache.commons.lang.time;
   17   
   18   import java.lang.reflect.Constructor;
   19   import java.lang.reflect.Modifier;
   20   import java.text.DateFormat;
   21   import java.text.ParseException;
   22   import java.text.SimpleDateFormat;
   23   import java.util.Calendar;
   24   import java.util.Date;
   25   import java.util.GregorianCalendar;
   26   import java.util.Iterator;
   27   import java.util.Locale;
   28   import java.util.NoSuchElementException;
   29   import java.util.TimeZone;
   30   
   31   import junit.framework.AssertionFailedError;
   32   import junit.framework.Test;
   33   import junit.framework.TestCase;
   34   import junit.framework.TestSuite;
   35   import junit.textui.TestRunner;
   36   
   37   import org.apache.commons.lang.SystemUtils;
   38   
   39   /**
   40    * Unit tests {@link org.apache.commons.lang.time.DateUtils}.
   41    *
   42    * @author <a href="mailto:sergek@lokitech.com">Serge Knystautas</a>
   43    * @author <a href="mailto:steve@mungoknotwise.com">Steven Caswell</a>
   44    */
   45   public class DateUtilsTest extends TestCase {
   46       DateFormat dateParser = null;
   47       DateFormat dateTimeParser = null;
   48       DateFormat timeZoneDateParser = null;
   49       Date dateAmPm1 = null;
   50       Date dateAmPm2 = null;
   51       Date dateAmPm3 = null;
   52       Date dateAmPm4 = null;
   53       Date date0 = null;
   54       Date date1 = null;
   55       Date date2 = null;
   56       Date date3 = null;
   57       Date date4 = null;
   58       Date date5 = null;
   59       Date date6 = null;
   60       Date date7 = null;
   61       Date date8 = null;
   62       Calendar calAmPm1 = null;
   63       Calendar calAmPm2 = null;
   64       Calendar calAmPm3 = null;
   65       Calendar calAmPm4 = null;
   66       Calendar cal1 = null;
   67       Calendar cal2 = null;
   68       Calendar cal3 = null;
   69       Calendar cal4 = null;
   70       Calendar cal5 = null;
   71       Calendar cal6 = null;
   72       Calendar cal7 = null;
   73       Calendar cal8 = null;
   74       TimeZone zone = null;
   75       TimeZone defaultZone = null;
   76   
   77       public DateUtilsTest(String name) {
   78           super(name);
   79       }
   80   
   81       public static void main(String[] args) {
   82           TestRunner.run(suite());
   83       }
   84   
   85       public static Test suite() {
   86           TestSuite suite = new TestSuite(DateUtilsTest.class);
   87           suite.setName("DateUtils Tests");
   88           return suite;
   89       }
   90   
   91       protected void setUp() throws Exception {
   92           super.setUp();
   93   
   94           dateParser = new SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH);
   95           dateTimeParser = new SimpleDateFormat("MMM dd, yyyy H:mm:ss.SSS", Locale.ENGLISH);
   96   
   97           dateAmPm1 = dateTimeParser.parse("February 3, 2002 01:10:00.000");
   98           dateAmPm2 = dateTimeParser.parse("February 3, 2002 11:10:00.000");
   99           dateAmPm3 = dateTimeParser.parse("February 3, 2002 13:10:00.000");
  100           dateAmPm4 = dateTimeParser.parse("February 3, 2002 19:10:00.000");
  101           date0 = dateTimeParser.parse("February 3, 2002 12:34:56.789");
  102           date1 = dateTimeParser.parse("February 12, 2002 12:34:56.789");
  103           date2 = dateTimeParser.parse("November 18, 2001 1:23:11.321");
  104           defaultZone = TimeZone.getDefault();
  105           zone = TimeZone.getTimeZone("MET");
  106           TimeZone.setDefault(zone);
  107           dateTimeParser.setTimeZone(zone);
  108           date3 = dateTimeParser.parse("March 30, 2003 05:30:45.000");
  109           date4 = dateTimeParser.parse("March 30, 2003 01:10:00.000");
  110           date5 = dateTimeParser.parse("March 30, 2003 01:40:00.000");
  111           date6 = dateTimeParser.parse("March 30, 2003 02:10:00.000");
  112           date7 = dateTimeParser.parse("March 30, 2003 02:40:00.000");
  113           date8 = dateTimeParser.parse("October 26, 2003 05:30:45.000");
  114           dateTimeParser.setTimeZone(defaultZone);
  115           TimeZone.setDefault(defaultZone);
  116           calAmPm1 = Calendar.getInstance();
  117           calAmPm1.setTime(dateAmPm1);
  118           calAmPm2 = Calendar.getInstance();
  119           calAmPm2.setTime(dateAmPm2);
  120           calAmPm3 = Calendar.getInstance();
  121           calAmPm3.setTime(dateAmPm3);
  122           calAmPm4 = Calendar.getInstance();
  123           calAmPm4.setTime(dateAmPm4);
  124           cal1 = Calendar.getInstance();
  125           cal1.setTime(date1);
  126           cal2 = Calendar.getInstance();
  127           cal2.setTime(date2);
  128           TimeZone.setDefault(zone);
  129           cal3 = Calendar.getInstance();
  130           cal3.setTime(date3);
  131           cal4 = Calendar.getInstance();
  132           cal4.setTime(date4);
  133           cal5 = Calendar.getInstance();
  134           cal5.setTime(date5);
  135           cal6 = Calendar.getInstance();
  136           cal6.setTime(date6);
  137           cal7 = Calendar.getInstance();
  138           cal7.setTime(date7);
  139           cal8 = Calendar.getInstance();
  140           cal8.setTime(date8);
  141           TimeZone.setDefault(defaultZone);
  142       }
  143   
  144       protected void tearDown() throws Exception {
  145           super.tearDown();
  146       }
  147   
  148       //-----------------------------------------------------------------------
  149       public void testConstructor() {
  150           assertNotNull(new DateUtils());
  151           Constructor[] cons = DateUtils.class.getDeclaredConstructors();
  152           assertEquals(1, cons.length);
  153           assertEquals(true, Modifier.isPublic(cons[0].getModifiers()));
  154           assertEquals(true, Modifier.isPublic(DateUtils.class.getModifiers()));
  155           assertEquals(false, Modifier.isFinal(DateUtils.class.getModifiers()));
  156       }
  157       
  158       //-----------------------------------------------------------------------
  159       public void testIsSameDay_Date() {
  160           Date date1 = new GregorianCalendar(2004, 6, 9, 13, 45).getTime();
  161           Date date2 = new GregorianCalendar(2004, 6, 9, 13, 45).getTime();
  162           assertEquals(true, DateUtils.isSameDay(date1, date2));
  163           date2 = new GregorianCalendar(2004, 6, 10, 13, 45).getTime();
  164           assertEquals(false, DateUtils.isSameDay(date1, date2));
  165           date1 = new GregorianCalendar(2004, 6, 10, 13, 45).getTime();
  166           assertEquals(true, DateUtils.isSameDay(date1, date2));
  167           date2 = new GregorianCalendar(2005, 6, 10, 13, 45).getTime();
  168           assertEquals(false, DateUtils.isSameDay(date1, date2));
  169           try {
  170               DateUtils.isSameDay((Date) null, (Date) null);
  171               fail();
  172           } catch (IllegalArgumentException ex) {}
  173       }
  174       
  175       //-----------------------------------------------------------------------
  176       public void testIsSameDay_Cal() {
  177           GregorianCalendar cal1 = new GregorianCalendar(2004, 6, 9, 13, 45);
  178           GregorianCalendar cal2 = new GregorianCalendar(2004, 6, 9, 13, 45);
  179           assertEquals(true, DateUtils.isSameDay(cal1, cal2));
  180           cal2.add(Calendar.DAY_OF_YEAR, 1);
  181           assertEquals(false, DateUtils.isSameDay(cal1, cal2));
  182           cal1.add(Calendar.DAY_OF_YEAR, 1);
  183           assertEquals(true, DateUtils.isSameDay(cal1, cal2));
  184           cal2.add(Calendar.YEAR, 1);
  185           assertEquals(false, DateUtils.isSameDay(cal1, cal2));
  186           try {
  187               DateUtils.isSameDay((Calendar) null, (Calendar) null);
  188               fail();
  189           } catch (IllegalArgumentException ex) {}
  190       }
  191       
  192       //-----------------------------------------------------------------------
  193       public void testIsSameInstant_Date() {
  194           Date date1 = new GregorianCalendar(2004, 6, 9, 13, 45).getTime();
  195           Date date2 = new GregorianCalendar(2004, 6, 9, 13, 45).getTime();
  196           assertEquals(true, DateUtils.isSameInstant(date1, date2));
  197           date2 = new GregorianCalendar(2004, 6, 10, 13, 45).getTime();
  198           assertEquals(false, DateUtils.isSameInstant(date1, date2));
  199           date1 = new GregorianCalendar(2004, 6, 10, 13, 45).getTime();
  200           assertEquals(true, DateUtils.isSameInstant(date1, date2));
  201           date2 = new GregorianCalendar(2005, 6, 10, 13, 45).getTime();
  202           assertEquals(false, DateUtils.isSameInstant(date1, date2));
  203           try {
  204               DateUtils.isSameInstant((Date) null, (Date) null);
  205               fail();
  206           } catch (IllegalArgumentException ex) {}
  207       }
  208       
  209       //-----------------------------------------------------------------------
  210       public void testIsSameInstant_Cal() {
  211           GregorianCalendar cal1 = new GregorianCalendar(TimeZone.getTimeZone("GMT+1"));
  212           GregorianCalendar cal2 = new GregorianCalendar(TimeZone.getTimeZone("GMT-1"));
  213           cal1.set(2004, 6, 9, 13, 45, 0);
  214           cal1.set(Calendar.MILLISECOND, 0);
  215           cal2.set(2004, 6, 9, 13, 45, 0);
  216           cal2.set(Calendar.MILLISECOND, 0);
  217           assertEquals(false, DateUtils.isSameInstant(cal1, cal2));
  218           
  219           cal2.set(2004, 6, 9, 11, 45, 0);
  220           assertEquals(true, DateUtils.isSameInstant(cal1, cal2));
  221           try {
  222               DateUtils.isSameInstant((Calendar) null, (Calendar) null);
  223               fail();
  224           } catch (IllegalArgumentException ex) {}
  225       }
  226       
  227       //-----------------------------------------------------------------------
  228       public void testIsSameLocalTime_Cal() {
  229           GregorianCalendar cal1 = new GregorianCalendar(TimeZone.getTimeZone("GMT+1"));
  230           GregorianCalendar cal2 = new GregorianCalendar(TimeZone.getTimeZone("GMT-1"));
  231           cal1.set(2004, 6, 9, 13, 45, 0);
  232           cal1.set(Calendar.MILLISECOND, 0);
  233           cal2.set(2004, 6, 9, 13, 45, 0);
  234           cal2.set(Calendar.MILLISECOND, 0);
  235           assertEquals(true, DateUtils.isSameLocalTime(cal1, cal2));
  236           
  237           cal2.set(2004, 6, 9, 11, 45, 0);
  238           assertEquals(false, DateUtils.isSameLocalTime(cal1, cal2));
  239           try {
  240               DateUtils.isSameLocalTime((Calendar) null, (Calendar) null);
  241               fail();
  242           } catch (IllegalArgumentException ex) {}
  243       }
  244       
  245       //-----------------------------------------------------------------------
  246       public void testParseDate() throws Exception {
  247           GregorianCalendar cal = new GregorianCalendar(1972, 11, 3);
  248           String dateStr = "1972-12-03";
  249           String[] parsers = new String[] {"yyyy'-'DDD", "yyyy'-'MM'-'dd", "yyyyMMdd"};
  250           Date date = DateUtils.parseDate(dateStr, parsers);
  251           assertEquals(cal.getTime(), date);
  252           
  253           dateStr = "1972-338";
  254           date = DateUtils.parseDate(dateStr, parsers);
  255           assertEquals(cal.getTime(), date);
  256           
  257           dateStr = "19721203";
  258           date = DateUtils.parseDate(dateStr, parsers);
  259           assertEquals(cal.getTime(), date);
  260           
  261           try {
  262               DateUtils.parseDate("PURPLE", parsers);
  263               fail();
  264           } catch (ParseException ex) {}
  265           try {
  266               DateUtils.parseDate("197212AB", parsers);
  267               fail();
  268           } catch (ParseException ex) {}
  269           try {
  270               DateUtils.parseDate(null, parsers);
  271               fail();
  272           } catch (IllegalArgumentException ex) {}
  273           try {
  274               DateUtils.parseDate(dateStr, null);
  275               fail();
  276           } catch (IllegalArgumentException ex) {}
  277       }
  278       
  279       //-----------------------------------------------------------------------
  280       /**
  281        * Tests various values with the round method
  282        */
  283       public void testRound() throws Exception {
  284           // tests for public static Date round(Date date, int field)
  285           assertEquals("round year-1 failed",
  286                   dateParser.parse("January 1, 2002"),
  287                   DateUtils.round(date1, Calendar.YEAR));
  288           assertEquals("round year-2 failed",
  289                   dateParser.parse("January 1, 2002"),
  290                   DateUtils.round(date2, Calendar.YEAR));
  291           assertEquals("round month-1 failed",
  292                   dateParser.parse("February 1, 2002"),
  293                   DateUtils.round(date1, Calendar.MONTH));
  294           assertEquals("round month-2 failed",
  295                   dateParser.parse("December 1, 2001"),
  296                   DateUtils.round(date2, Calendar.MONTH));
  297           assertEquals("round semimonth-0 failed",
  298                   dateParser.parse("February 1, 2002"),
  299                   DateUtils.round(date0, DateUtils.SEMI_MONTH));
  300           assertEquals("round semimonth-1 failed",
  301                   dateParser.parse("February 16, 2002"),
  302                   DateUtils.round(date1, DateUtils.SEMI_MONTH));
  303           assertEquals("round semimonth-2 failed",
  304                   dateParser.parse("November 16, 2001"),
  305                   DateUtils.round(date2, DateUtils.SEMI_MONTH));
  306           assertEquals("round date-1 failed",
  307                   dateParser.parse("February 13, 2002"),
  308                   DateUtils.round(date1, Calendar.DATE));
  309           assertEquals("round date-2 failed",
  310                   dateParser.parse("November 18, 2001"),
  311                   DateUtils.round(date2, Calendar.DATE));
  312           assertEquals("round hour-1 failed",
  313                   dateTimeParser.parse("February 12, 2002 13:00:00.000"),
  314                   DateUtils.round(date1, Calendar.HOUR));
  315           assertEquals("round hour-2 failed",
  316                   dateTimeParser.parse("November 18, 2001 1:00:00.000"),
  317                   DateUtils.round(date2, Calendar.HOUR));
  318           assertEquals("round minute-1 failed",
  319                   dateTimeParser.parse("February 12, 2002 12:35:00.000"),
  320                   DateUtils.round(date1, Calendar.MINUTE));
  321           assertEquals("round minute-2 failed",
  322                   dateTimeParser.parse("November 18, 2001 1:23:00.000"),
  323                   DateUtils.round(date2, Calendar.MINUTE));
  324           assertEquals("round second-1 failed",
  325                   dateTimeParser.parse("February 12, 2002 12:34:57.000"),
  326                   DateUtils.round(date1, Calendar.SECOND));
  327           assertEquals("round second-2 failed",
  328                   dateTimeParser.parse("November 18, 2001 1:23:11.000"),
  329                   DateUtils.round(date2, Calendar.SECOND));
  330           assertEquals("truncate ampm-1 failed",
  331                   dateTimeParser.parse("February 3, 2002 00:00:00.000"),
  332                   DateUtils.round(dateAmPm1, Calendar.AM_PM));
  333           assertEquals("truncate ampm-2 failed",
  334                   dateTimeParser.parse("February 4, 2002 00:00:00.000"),
  335                   DateUtils.round(dateAmPm2, Calendar.AM_PM));
  336           assertEquals("truncate ampm-3 failed",
  337                   dateTimeParser.parse("February 3, 2002 12:00:00.000"),
  338                   DateUtils.round(dateAmPm3, Calendar.AM_PM));
  339           assertEquals("truncate ampm-4 failed",
  340                   dateTimeParser.parse("February 4, 2002 12:00:00.000"),
  341                   DateUtils.round(dateAmPm4, Calendar.AM_PM));
  342   
  343           // tests for public static Date round(Object date, int field)
  344           assertEquals("round year-1 failed",
  345                   dateParser.parse("January 1, 2002"),
  346                   DateUtils.round((Object) date1, Calendar.YEAR));
  347           assertEquals("round year-2 failed",
  348                   dateParser.parse("January 1, 2002"),
  349                   DateUtils.round((Object) date2, Calendar.YEAR));
  350           assertEquals("round month-1 failed",
  351                   dateParser.parse("February 1, 2002"),
  352                   DateUtils.round((Object) date1, Calendar.MONTH));
  353           assertEquals("round month-2 failed",
  354                   dateParser.parse("December 1, 2001"),
  355                   DateUtils.round((Object) date2, Calendar.MONTH));
  356           assertEquals("round semimonth-1 failed",
  357                   dateParser.parse("February 16, 2002"),
  358                   DateUtils.round((Object) date1, DateUtils.SEMI_MONTH));
  359           assertEquals("round semimonth-2 failed",
  360                   dateParser.parse("November 16, 2001"),
  361                   DateUtils.round((Object) date2, DateUtils.SEMI_MONTH));
  362           assertEquals("round date-1 failed",
  363                   dateParser.parse("February 13, 2002"),
  364                   DateUtils.round((Object) date1, Calendar.DATE));
  365           assertEquals("round date-2 failed",
  366                   dateParser.parse("November 18, 2001"),
  367                   DateUtils.round((Object) date2, Calendar.DATE));
  368           assertEquals("round hour-1 failed",
  369                   dateTimeParser.parse("February 12, 2002 13:00:00.000"),
  370                   DateUtils.round((Object) date1, Calendar.HOUR));
  371           assertEquals("round hour-2 failed",
  372                   dateTimeParser.parse("November 18, 2001 1:00:00.000"),
  373                   DateUtils.round((Object) date2, Calendar.HOUR));
  374           assertEquals("round minute-1 failed",
  375                   dateTimeParser.parse("February 12, 2002 12:35:00.000"),
  376                   DateUtils.round((Object) date1, Calendar.MINUTE));
  377           assertEquals("round minute-2 failed",
  378                   dateTimeParser.parse("November 18, 2001 1:23:00.000"),
  379                   DateUtils.round((Object) date2, Calendar.MINUTE));
  380           assertEquals("round second-1 failed",
  381                   dateTimeParser.parse("February 12, 2002 12:34:57.000"),
  382                   DateUtils.round((Object) date1, Calendar.SECOND));
  383           assertEquals("round second-2 failed",
  384                   dateTimeParser.parse("November 18, 2001 1:23:11.000"),
  385                   DateUtils.round((Object) date2, Calendar.SECOND));
  386           assertEquals("round calendar second-1 failed",
  387                   dateTimeParser.parse("February 12, 2002 12:34:57.000"),
  388                   DateUtils.round((Object) cal1, Calendar.SECOND));
  389           assertEquals("round calendar second-2 failed",
  390                   dateTimeParser.parse("November 18, 2001 1:23:11.000"),
  391                   DateUtils.round((Object) cal2, Calendar.SECOND));
  392           assertEquals("truncate ampm-1 failed",
  393                   dateTimeParser.parse("February 3, 2002 00:00:00.000"),
  394                   DateUtils.round((Object) dateAmPm1, Calendar.AM_PM));
  395           assertEquals("truncate ampm-2 failed",
  396                   dateTimeParser.parse("February 4, 2002 00:00:00.000"),
  397                   DateUtils.round((Object) dateAmPm2, Calendar.AM_PM));
  398           assertEquals("truncate ampm-3 failed",
  399                   dateTimeParser.parse("February 3, 2002 12:00:00.000"),
  400                   DateUtils.round((Object) dateAmPm3, Calendar.AM_PM));
  401           assertEquals("truncate ampm-4 failed",
  402                   dateTimeParser.parse("February 4, 2002 12:00:00.000"),
  403                   DateUtils.round((Object) dateAmPm4, Calendar.AM_PM));
  404   
  405           try {
  406               DateUtils.round((Date) null, Calendar.SECOND);
  407               fail();
  408           } catch (IllegalArgumentException ex) {}
  409           try {
  410               DateUtils.round((Calendar) null, Calendar.SECOND);
  411               fail();
  412           } catch (IllegalArgumentException ex) {}
  413           try {
  414               DateUtils.round((Object) null, Calendar.SECOND);
  415               fail();
  416           } catch (IllegalArgumentException ex) {}
  417           try {
  418               DateUtils.round("", Calendar.SECOND);
  419               fail();
  420           } catch (ClassCastException ex) {}
  421           try {
  422               DateUtils.round(date1, -9999);
  423               fail();
  424           } catch(IllegalArgumentException ex) {}
  425   
  426           assertEquals("truncate ampm-1 failed",
  427                   dateTimeParser.parse("February 3, 2002 00:00:00.000"),
  428                   DateUtils.round((Object) calAmPm1, Calendar.AM_PM));
  429           assertEquals("truncate ampm-2 failed",
  430                   dateTimeParser.parse("February 4, 2002 00:00:00.000"),
  431                   DateUtils.round((Object) calAmPm2, Calendar.AM_PM));
  432           assertEquals("truncate ampm-3 failed",
  433                   dateTimeParser.parse("February 3, 2002 12:00:00.000"),
  434                   DateUtils.round((Object) calAmPm3, Calendar.AM_PM));
  435           assertEquals("truncate ampm-4 failed",
  436                   dateTimeParser.parse("February 4, 2002 12:00:00.000"),
  437                   DateUtils.round((Object) calAmPm4, Calendar.AM_PM));
  438           
  439           // Fix for http://issues.apache.org/bugzilla/show_bug.cgi?id=25560
  440           // Test rounding across the beginning of daylight saving time
  441           TimeZone.setDefault(zone);
  442           dateTimeParser.setTimeZone(zone);
  443           assertEquals("round MET date across DST change-over",
  444                   dateTimeParser.parse("March 30, 2003 00:00:00.000"),
  445                   DateUtils.round(date4, Calendar.DATE));
  446           assertEquals("round MET date across DST change-over",
  447                   dateTimeParser.parse("March 30, 2003 00:00:00.000"),
  448                   DateUtils.round((Object) cal4, Calendar.DATE));
  449           assertEquals("round MET date across DST change-over",
  450                   dateTimeParser.parse("March 30, 2003 00:00:00.000"),
  451                   DateUtils.round(date5, Calendar.DATE));
  452           assertEquals("round MET date across DST change-over",
  453                   dateTimeParser.parse("March 30, 2003 00:00:00.000"),
  454                   DateUtils.round((Object) cal5, Calendar.DATE));
  455           assertEquals("round MET date across DST change-over",
  456                   dateTimeParser.parse("March 30, 2003 00:00:00.000"),
  457                   DateUtils.round(date6, Calendar.DATE));
  458           assertEquals("round MET date across DST change-over",
  459                   dateTimeParser.parse("March 30, 2003 00:00:00.000"),
  460                   DateUtils.round((Object) cal6, Calendar.DATE));
  461           assertEquals("round MET date across DST change-over",
  462                   dateTimeParser.parse("March 30, 2003 00:00:00.000"),
  463                   DateUtils.round(date7, Calendar.DATE));
  464           assertEquals("round MET date across DST change-over",
  465                   dateTimeParser.parse("March 30, 2003 00:00:00.000"),
  466                   DateUtils.round((Object) cal7, Calendar.DATE));
  467           
  468           assertEquals("round MET date across DST change-over",
  469                   dateTimeParser.parse("March 30, 2003 01:00:00.000"),
  470                   DateUtils.round(date4, Calendar.HOUR_OF_DAY));
  471           assertEquals("round MET date across DST change-over",
  472                   dateTimeParser.parse("March 30, 2003 01:00:00.000"),
  473                   DateUtils.round((Object) cal4, Calendar.HOUR_OF_DAY));
  474           if (SystemUtils.isJavaVersionAtLeast(1.4f)) {
  475               assertEquals("round MET date across DST change-over",
  476                       dateTimeParser.parse("March 30, 2003 03:00:00.000"),
  477                       DateUtils.round(date5, Calendar.HOUR_OF_DAY));
  478               assertEquals("round MET date across DST change-over",
  479                       dateTimeParser.parse("March 30, 2003 03:00:00.000"),
  480                       DateUtils.round((Object) cal5, Calendar.HOUR_OF_DAY));
  481               assertEquals("round MET date across DST change-over",
  482                       dateTimeParser.parse("March 30, 2003 03:00:00.000"),
  483                       DateUtils.round(date6, Calendar.HOUR_OF_DAY));
  484               assertEquals("round MET date across DST change-over",
  485                       dateTimeParser.parse("March 30, 2003 03:00:00.000"),
  486                       DateUtils.round((Object) cal6, Calendar.HOUR_OF_DAY));
  487               assertEquals("round MET date across DST change-over",
  488                       dateTimeParser.parse("March 30, 2003 04:00:00.000"),
  489                       DateUtils.round(date7, Calendar.HOUR_OF_DAY));
  490               assertEquals("round MET date across DST change-over",
  491                       dateTimeParser.parse("March 30, 2003 04:00:00.000"),
  492                       DateUtils.round((Object) cal7, Calendar.HOUR_OF_DAY));
  493           } else {
  494               this.warn("Some date rounding tests not run since the current version is " + SystemUtils.JAVA_VERSION);
  495           }
  496           TimeZone.setDefault(defaultZone);
  497           dateTimeParser.setTimeZone(defaultZone);
  498       }
  499   
  500       /**
  501        * Tests various values with the trunc method
  502        */
  503       public void testTruncate() throws Exception {
  504           // tests public static Date truncate(Date date, int field)
  505           assertEquals("truncate year-1 failed",
  506                   dateParser.parse("January 1, 2002"),
  507                   DateUtils.truncate(date1, Calendar.YEAR));
  508           assertEquals("truncate year-2 failed",
  509                   dateParser.parse("January 1, 2001"),
  510                   DateUtils.truncate(date2, Calendar.YEAR));
  511           assertEquals("truncate month-1 failed",
  512                   dateParser.parse("February 1, 2002"),
  513                   DateUtils.truncate(date1, Calendar.MONTH));
  514           assertEquals("truncate month-2 failed",
  515                   dateParser.parse("November 1, 2001"),
  516                   DateUtils.truncate(date2, Calendar.MONTH));
  517           assertEquals("truncate semimonth-1 failed",
  518                   dateParser.parse("February 1, 2002"),
  519                   DateUtils.truncate(date1, DateUtils.SEMI_MONTH));
  520           assertEquals("truncate semimonth-2 failed",
  521                   dateParser.parse("November 16, 2001"),
  522                   DateUtils.truncate(date2, DateUtils.SEMI_MONTH));
  523           assertEquals("truncate date-1 failed",
  524                   dateParser.parse("February 12, 2002"),
  525                   DateUtils.truncate(date1, Calendar.DATE));
  526           assertEquals("truncate date-2 failed",
  527                   dateParser.parse("November 18, 2001"),
  528                   DateUtils.truncate(date2, Calendar.DATE));
  529           assertEquals("truncate hour-1 failed",
  530                   dateTimeParser.parse("February 12, 2002 12:00:00.000"),
  531                   DateUtils.truncate(date1, Calendar.HOUR));
  532           assertEquals("truncate hour-2 failed",
  533                   dateTimeParser.parse("November 18, 2001 1:00:00.000"),
  534                   DateUtils.truncate(date2, Calendar.HOUR));
  535           assertEquals("truncate minute-1 failed",
  536                   dateTimeParser.parse("February 12, 2002 12:34:00.000"),
  537                   DateUtils.truncate(date1, Calendar.MINUTE));
  538           assertEquals("truncate minute-2 failed",
  539                   dateTimeParser.parse("November 18, 2001 1:23:00.000"),
  540                   DateUtils.truncate(date2, Calendar.MINUTE));
  541           assertEquals("truncate second-1 failed",
  542                   dateTimeParser.parse("February 12, 2002 12:34:56.000"),
  543                   DateUtils.truncate(date1, Calendar.SECOND));
  544           assertEquals("truncate second-2 failed",
  545                   dateTimeParser.parse("November 18, 2001 1:23:11.000"),
  546                   DateUtils.truncate(date2, Calendar.SECOND));
  547           assertEquals("truncate ampm-1 failed",
  548                   dateTimeParser.parse("February 3, 2002 00:00:00.000"),
  549                   DateUtils.truncate(dateAmPm1, Calendar.AM_PM));
  550           assertEquals("truncate ampm-2 failed",
  551                   dateTimeParser.parse("February 3, 2002 00:00:00.000"),
  552                   DateUtils.truncate(dateAmPm2, Calendar.AM_PM));
  553           assertEquals("truncate ampm-3 failed",
  554                   dateTimeParser.parse("February 3, 2002 12:00:00.000"),
  555                   DateUtils.truncate(dateAmPm3, Calendar.AM_PM));
  556           assertEquals("truncate ampm-4 failed",
  557                   dateTimeParser.parse("February 3, 2002 12:00:00.000"),
  558                   DateUtils.truncate(dateAmPm4, Calendar.AM_PM));
  559   
  560           // tests public static Date truncate(Object date, int field)
  561           assertEquals("truncate year-1 failed",
  562                   dateParser.parse("January 1, 2002"),
  563                   DateUtils.truncate((Object) date1, Calendar.YEAR));
  564           assertEquals("truncate year-2 failed",
  565                   dateParser.parse("January 1, 2001"),
  566                   DateUtils.truncate((Object) date2, Calendar.YEAR));
  567           assertEquals("truncate month-1 failed",
  568                   dateParser.parse("February 1, 2002"),
  569                   DateUtils.truncate((Object) date1, Calendar.MONTH));
  570           assertEquals("truncate month-2 failed",
  571                   dateParser.parse("November 1, 2001"),
  572                   DateUtils.truncate((Object) date2, Calendar.MONTH));
  573           assertEquals("truncate semimonth-1 failed",
  574                   dateParser.parse("February 1, 2002"),
  575                   DateUtils.truncate((Object) date1, DateUtils.SEMI_MONTH));
  576           assertEquals("truncate semimonth-2 failed",
  577                   dateParser.parse("November 16, 2001"),
  578                   DateUtils.truncate((Object) date2, DateUtils.SEMI_MONTH));
  579           assertEquals("truncate date-1 failed",
  580                   dateParser.parse("February 12, 2002"),
  581                   DateUtils.truncate((Object) date1, Calendar.DATE));
  582           assertEquals("truncate date-2 failed",
  583                   dateParser.parse("November 18, 2001"),
  584                   DateUtils.truncate((Object) date2, Calendar.DATE));
  585           assertEquals("truncate hour-1 failed",
  586                   dateTimeParser.parse("February 12, 2002 12:00:00.000"),
  587                   DateUtils.truncate((Object) date1, Calendar.HOUR));
  588           assertEquals("truncate hour-2 failed",
  589                   dateTimeParser.parse("November 18, 2001 1:00:00.000"),
  590                   DateUtils.truncate((Object) date2, Calendar.HOUR));
  591           assertEquals("truncate minute-1 failed",
  592                   dateTimeParser.parse("February 12, 2002 12:34:00.000"),
  593                   DateUtils.truncate((Object) date1, Calendar.MINUTE));
  594           assertEquals("truncate minute-2 failed",
  595                   dateTimeParser.parse("November 18, 2001 1:23:00.000"),
  596                   DateUtils.truncate((Object) date2, Calendar.MINUTE));
  597           assertEquals("truncate second-1 failed",
  598                   dateTimeParser.parse("February 12, 2002 12:34:56.000"),
  599                   DateUtils.truncate((Object) date1, Calendar.SECOND));
  600           assertEquals("truncate second-2 failed",
  601                   dateTimeParser.parse("November 18, 2001 1:23:11.000"),
  602                   DateUtils.truncate((Object) date2, Calendar.SECOND));
  603           assertEquals("truncate ampm-1 failed",
  604                   dateTimeParser.parse("February 3, 2002 00:00:00.000"),
  605                   DateUtils.truncate((Object) dateAmPm1, Calendar.AM_PM));
  606           assertEquals("truncate ampm-2 failed",
  607                   dateTimeParser.parse("February 3, 2002 00:00:00.000"),
  608                   DateUtils.truncate((Object) dateAmPm2, Calendar.AM_PM));
  609           assertEquals("truncate ampm-3 failed",
  610                   dateTimeParser.parse("February 3, 2002 12:00:00.000"),
  611                   DateUtils.truncate((Object) dateAmPm3, Calendar.AM_PM));
  612           assertEquals("truncate ampm-4 failed",
  613                   dateTimeParser.parse("February 3, 2002 12:00:00.000"),
  614                   DateUtils.truncate((Object) dateAmPm4, Calendar.AM_PM));
  615           
  616           assertEquals("truncate calendar second-1 failed",
  617                   dateTimeParser.parse("February 12, 2002 12:34:56.000"),
  618                   DateUtils.truncate((Object) cal1, Calendar.SECOND));
  619           assertEquals("truncate calendar second-2 failed",
  620                   dateTimeParser.parse("November 18, 2001 1:23:11.000"),
  621                   DateUtils.truncate((Object) cal2, Calendar.SECOND));
  622           
  623           assertEquals("truncate ampm-1 failed",
  624                   dateTimeParser.parse("February 3, 2002 00:00:00.000"),
  625                   DateUtils.truncate((Object) calAmPm1, Calendar.AM_PM));
  626           assertEquals("truncate ampm-2 failed",
  627                   dateTimeParser.parse("February 3, 2002 00:00:00.000"),
  628                   DateUtils.truncate((Object) calAmPm2, Calendar.AM_PM));
  629           assertEquals("truncate ampm-3 failed",
  630                   dateTimeParser.parse("February 3, 2002 12:00:00.000"),
  631                   DateUtils.truncate((Object) calAmPm3, Calendar.AM_PM));
  632           assertEquals("truncate ampm-4 failed",
  633                   dateTimeParser.parse("February 3, 2002 12:00:00.000"),
  634                   DateUtils.truncate((Object) calAmPm4, Calendar.AM_PM));
  635           
  636           try {
  637               DateUtils.truncate((Date) null, Calendar.SECOND);
  638               fail();
  639           } catch (IllegalArgumentException ex) {}
  640           try {
  641               DateUtils.truncate((Calendar) null, Calendar.SECOND);
  642               fail();
  643           } catch (IllegalArgumentException ex) {}
  644           try {
  645               DateUtils.truncate((Object) null, Calendar.SECOND);
  646               fail();
  647           } catch (IllegalArgumentException ex) {}
  648           try {
  649               DateUtils.truncate("", Calendar.SECOND);
  650               fail();
  651           } catch (ClassCastException ex) {}
  652   
  653           // Fix for http://issues.apache.org/bugzilla/show_bug.cgi?id=25560
  654           // Test truncate across beginning of daylight saving time
  655           TimeZone.setDefault(zone);
  656           dateTimeParser.setTimeZone(zone);
  657           assertEquals("truncate MET date across DST change-over",
  658                   dateTimeParser.parse("March 30, 2003 00:00:00.000"),
  659                   DateUtils.truncate(date3, Calendar.DATE));
  660           assertEquals("truncate MET date across DST change-over",
  661                   dateTimeParser.parse("March 30, 2003 00:00:00.000"),
  662                   DateUtils.truncate((Object) cal3, Calendar.DATE));
  663           // Test truncate across end of daylight saving time
  664           assertEquals("truncate MET date across DST change-over",
  665                   dateTimeParser.parse("October 26, 2003 00:00:00.000"),
  666                   DateUtils.truncate(date8, Calendar.DATE));
  667           assertEquals("truncate MET date across DST change-over",
  668                   dateTimeParser.parse("October 26, 2003 00:00:00.000"),
  669                   DateUtils.truncate((Object) cal8, Calendar.DATE));
  670           TimeZone.setDefault(defaultZone);
  671           dateTimeParser.setTimeZone(defaultZone);
  672           
  673           // Bug 31395, large dates
  674           Date endOfTime = new Date(Long.MAX_VALUE); // fyi: Sun Aug 17 07:12:55 CET 292278994 -- 807 millis
  675           GregorianCalendar endCal = new GregorianCalendar();
  676           endCal.setTime(endOfTime);
  677           try {
  678               DateUtils.truncate(endCal, Calendar.DATE);
  679               fail();
  680           } catch (ArithmeticException ex) {}
  681           endCal.set(Calendar.YEAR, 280000001);
  682           try {
  683               DateUtils.truncate(endCal, Calendar.DATE);
  684               fail();
  685           } catch (ArithmeticException ex) {}
  686           endCal.set(Calendar.YEAR, 280000000);
  687           Calendar cal = DateUtils.truncate(endCal, Calendar.DATE);
  688           assertEquals(0, cal.get(Calendar.HOUR));
  689       }
  690   
  691       /**
  692        * Tests the iterator exceptions
  693        */
  694       public void testIteratorEx() throws Exception {
  695           try {
  696               DateUtils.iterator(Calendar.getInstance(), -9999);
  697           } catch (IllegalArgumentException ex) {}
  698           try {
  699               DateUtils.iterator((Date) null, DateUtils.RANGE_WEEK_CENTER);
  700               fail();
  701           } catch (IllegalArgumentException ex) {}
  702           try {
  703               DateUtils.iterator((Calendar) null, DateUtils.RANGE_WEEK_CENTER);
  704               fail();
  705           } catch (IllegalArgumentException ex) {}
  706           try {
  707               DateUtils.iterator((Object) null, DateUtils.RANGE_WEEK_CENTER);
  708               fail();
  709           } catch (IllegalArgumentException ex) {}
  710           try {
  711               DateUtils.iterator("", DateUtils.RANGE_WEEK_CENTER);
  712               fail();
  713           } catch (ClassCastException ex) {}
  714       }
  715   
  716       /**
  717        * Tests the calendar iterator for week ranges
  718        */
  719       public void testWeekIterator() throws Exception {
  720           Calendar now = Calendar.getInstance();
  721           for (int i = 0; i< 7; i++) {
  722               Calendar today = DateUtils.truncate(now, Calendar.DATE);
  723               Calendar sunday = DateUtils.truncate(now, Calendar.DATE);
  724               sunday.add(Calendar.DATE, 1 - sunday.get(Calendar.DAY_OF_WEEK));
  725               Calendar monday = DateUtils.truncate(now, Calendar.DATE);
  726               if (monday.get(Calendar.DAY_OF_WEEK) == 1) {
  727                   //This is sunday... roll back 6 days
  728                   monday.add(Calendar.DATE, -6);
  729               } else {
  730                   monday.add(Calendar.DATE, 2 - monday.get(Calendar.DAY_OF_WEEK));
  731               }
  732               Calendar centered = DateUtils.truncate(now, Calendar.DATE);
  733               centered.add(Calendar.DATE, -3);
  734               
  735               Iterator it = DateUtils.iterator(now, DateUtils.RANGE_WEEK_SUNDAY);
  736               assertWeekIterator(it, sunday);
  737               it = DateUtils.iterator(now, DateUtils.RANGE_WEEK_MONDAY);
  738               assertWeekIterator(it, monday);
  739               it = DateUtils.iterator(now, DateUtils.RANGE_WEEK_RELATIVE);
  740               assertWeekIterator(it, today);
  741               it = DateUtils.iterator(now, DateUtils.RANGE_WEEK_CENTER);
  742               assertWeekIterator(it, centered);
  743               
  744               it = DateUtils.iterator((Object) now, DateUtils.RANGE_WEEK_CENTER);
  745               assertWeekIterator(it, centered);
  746               it = DateUtils.iterator((Object) now.getTime(), DateUtils.RANGE_WEEK_CENTER);
  747               assertWeekIterator(it, centered);
  748               try {
  749                   it.next();
  750                   fail();
  751               } catch (NoSuchElementException ex) {}
  752               it = DateUtils.iterator(now, DateUtils.RANGE_WEEK_CENTER);
  753               it.next();
  754               try {
  755                   it.remove();
  756               } catch( UnsupportedOperationException ex) {}
  757               
  758               now.add(Calendar.DATE,1);
  759           }
  760       }
  761               
  762       /**
  763        * Tests the calendar iterator for month-based ranges
  764        */
  765       public void testMonthIterator() throws Exception {
  766           Iterator it = DateUtils.iterator(date1, DateUtils.RANGE_MONTH_SUNDAY);
  767           assertWeekIterator(it,
  768                   dateParser.parse("January 27, 2002"),
  769                   dateParser.parse("March 2, 2002"));
  770   
  771           it = DateUtils.iterator(date1, DateUtils.RANGE_MONTH_MONDAY);
  772           assertWeekIterator(it,
  773                   dateParser.parse("January 28, 2002"),
  774                   dateParser.parse("March 3, 2002"));
  775   
  776           it = DateUtils.iterator(date2, DateUtils.RANGE_MONTH_SUNDAY);
  777           assertWeekIterator(it,
  778                   dateParser.parse("October 28, 2001"),
  779                   dateParser.parse("December 1, 2001"));
  780   
  781           it = DateUtils.iterator(date2, DateUtils.RANGE_MONTH_MONDAY);
  782           assertWeekIterator(it,
  783                   dateParser.parse("October 29, 2001"),
  784                   dateParser.parse("December 2, 2001"));
  785       }
  786   
  787       /**
  788        * This checks that this is a 7 element iterator of Calendar objects
  789        * that are dates (no time), and exactly 1 day spaced after each other.
  790        */
  791       private static void assertWeekIterator(Iterator it, Calendar start) {
  792           Calendar end = (Calendar) start.clone();
  793           end.add(Calendar.DATE, 6);
  794   
  795           assertWeekIterator(it, start, end);
  796       }
  797   
  798       /**
  799        * Convenience method for when working with Date objects
  800        */
  801       private static void assertWeekIterator(Iterator it, Date start, Date end) {
  802           Calendar calStart = Calendar.getInstance();
  803           calStart.setTime(start);
  804           Calendar calEnd = Calendar.getInstance();
  805           calEnd.setTime(end);
  806   
  807           assertWeekIterator(it, calStart, calEnd);
  808       }
  809   
  810       /**
  811        * This checks that this is a 7 divisble iterator of Calendar objects
  812        * that are dates (no time), and exactly 1 day spaced after each other
  813        * (in addition to the proper start and stop dates)
  814        */
  815       private static void assertWeekIterator(Iterator it, Calendar start, Calendar end) {
  816           Calendar cal = (Calendar) it.next();
  817           assertEquals("", start, cal, 0);
  818           Calendar last = null;
  819           int count = 1;
  820           while (it.hasNext()) {
  821               //Check this is just a date (no time component)
  822               assertEquals("", cal, DateUtils.truncate(cal, Calendar.DATE), 0);
  823   
  824               last = cal;
  825               cal = (Calendar) it.next();
  826               count++;
  827   
  828               //Check that this is one day more than the last date
  829               last.add(Calendar.DATE, 1);
  830               assertEquals("", last, cal, 0);
  831           }
  832           if (count % 7 != 0) {
  833               throw new AssertionFailedError("There were " + count + " days in this iterator");
  834           }
  835           assertEquals("", end, cal, 0);
  836       }
  837   
  838       /**
  839        * Used to check that Calendar objects are close enough
  840        * delta is in milliseconds
  841        */
  842       private static void assertEquals(String message, Calendar cal1, Calendar cal2, long delta) {
  843           if (Math.abs(cal1.getTime().getTime() - cal2.getTime().getTime()) > delta) {
  844               throw new AssertionFailedError(
  845                       message + " expected " + cal1.getTime() + " but got " + cal2.getTime());
  846           }
  847       }
  848   
  849       void warn(String msg) {
  850           System.err.println(msg);
  851       }
  852   }
  853   

Save This Page
Home » commons-lang-2.4-src » org.apache.commons » lang » time » [javadoc | source]