Mega Code Archive

 
Categories / Java / Data Type
 

Date format and parse Util

/*  * Copyright WizTools.org  * Licensed under the Apache License, Version 2.0:  * http://www.apache.org/licenses/LICENSE-2.0  */ //package org.wiztools.commons; import java.text.Format; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.regex.Pattern; /**  *  * @author subwiz  */ public final class DateUtil {     private static final SimpleDateFormat SDF_ISO_DATE = new SimpleDateFormat(             "yyyy-MM-dd");     private static final SimpleDateFormat SDF_ISO_TIME = new SimpleDateFormat(             "HH:mm:ss");     /**      * Returns the date in ISO 8601 format yyyy-MM-dd.      * @param date      * @return      */     public static String getAsISODateString(final Date date){         return SDF_ISO_DATE.format(date);     }     /**      * Returns the date and time in ISO 8601 format yyyy-MM-dd HH:mm:ss      * @param date      * @return      */     public static String getAsISODateTimeString(final Date date){         return SDF_ISO_DATE.format(date) + "T" + SDF_ISO_TIME.format(date);     }     /**      * Returns java.util.Date object for the ISO 8601 formatted String yyyy-MM-dd.      * @param dateStr      * @return      */     public static Date getFromISODateString(final String dateStr){         try{             Format fmt = new SimpleDateFormat("yyyy-MM-dd");             return (Date) fmt.parseObject(dateStr);         }         catch(ParseException ex) {             throw new IllegalArgumentException(ex);         }     }     /**      * This is an inclusive method: returns true if the date is equal to startDate or endDate.      * @param startDate The start date.      * @param endDate The end date.      * @param date The date to verify.      * @return true if the date falls between start date and end date.      */     public static boolean isDateBetween(final Date startDate,             final Date endDate,             final Date date) {         // check if end date is later than start date:         if(startDate.compareTo(endDate) > 0) {             throw new IllegalArgumentException("Start date cannot be greater than end date!");         }         if(date.compareTo(startDate) >= 0 && date.compareTo(endDate) <= 0) {             return true;         }         return false;     }     private static Date getDatePlus(final int unit, final Date date, final int quantity) {         Calendar c = Calendar.getInstance();         c.clear();         c.setTime(date);         c.add(unit, quantity);         return c.getTime();     }     /**      * Adds the number of days to the date and returns the new Date instance.      * @param date Input date.      * @param months Number of days to add.      * @return Computed date.      */     public static Date getDatePlusDays(final Date date, final int days){         return getDatePlus(Calendar.DATE, date, days);     }     /**      * Adds the number of months to the date and returns the new Date instance.      * @param date Input date.      * @param months Number of months to add.      * @return Computed date.      */     public static Date getDatePlusMonths(final Date date, final int months){         return getDatePlus(Calendar.MONTH, date, months);     }     /**      * Adds the number of years to the date and returns the new Date instance.      * @param date Input date.      * @param years Number of years to add.      * @return Computed date.      */     public static Date getDatePlusYears(final Date date, final int years){         return getDatePlus(Calendar.YEAR, date, years);     }     // Date Parsing using common pattern:     private static final Pattern p1 = Pattern.compile("[0-9]{1,2}-[0-9]{1,2}-[0-9]{2}");     private static final SimpleDateFormat sdf_p1 = new SimpleDateFormat("dd-MM-yy");     private static final Pattern p2 = Pattern.compile("[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}");     private static final SimpleDateFormat sdf_p2 = new SimpleDateFormat("dd-MM-yyyy");     private static final Pattern p3 = Pattern.compile("[0-9]{1,2}/[0-9]{1,2}/[0-9]{2}");     private static final SimpleDateFormat sdf_p3 = new SimpleDateFormat("dd/MM/yy");     private static final Pattern p4 = Pattern.compile("[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}");     private static final SimpleDateFormat sdf_p4 = new SimpleDateFormat("dd/MM/yyyy");     private static final Pattern p5 = Pattern.compile("[A-Za-z]{3} [0-9]{1,2}, [0-9]{4}");     private static final SimpleDateFormat sdf_p5 = new SimpleDateFormat("MMM dd, yyyy");     private static final Pattern p6 = Pattern.compile("[A-Za-z]{3} [0-9]{1,2} [0-9]{4}");     private static final SimpleDateFormat sdf_p6 = new SimpleDateFormat("MMM dd yyyy");     private static final Pattern p7 = Pattern.compile("[0-9]{4}-[0-9]{2}-[0-9]{2}");     private static final SimpleDateFormat sdf_p7 = new SimpleDateFormat("yyyy-MM-dd");     /**      * Tries to match common patterns by which date is mentioned, and returns a Date object.      * @param dateStr The date in common pattern.      * @return The java.util.Date object constructed by parsing the input string.      * @throws ParseException Thrown when not able to parse the date string.      */     public static Date getDateFromString(final String dateStr) throws ParseException{         SimpleDateFormat sdf = null;         if(p1.matcher(dateStr).matches()){             sdf = sdf_p1;         }         else if(p2.matcher(dateStr).matches()){             sdf = sdf_p2;         }         else if(p3.matcher(dateStr).matches()){             sdf = sdf_p3;         }         else if(p4.matcher(dateStr).matches()){             sdf = sdf_p4;         }         else if(p5.matcher(dateStr).matches()){             sdf = sdf_p5;         }         else if(p6.matcher(dateStr).matches()){             sdf = sdf_p6;         }         else if(p7.matcher(dateStr).matches()){             sdf = sdf_p7;         }         if(sdf != null){             return sdf.parse(dateStr);         }         throw new ParseException(dateStr + " does not match any defined pattern!", 0);     }     public static Date now(){         return new Date();     } } -------------- /*  * Copyright WizTools.org  * Licensed under the Apache License, Version 2.0:  * http://www.apache.org/licenses/LICENSE-2.0  */ package org.wiztools.commons; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.*; /**  *  * @author subwiz  */ public class DateUtilTest {     public DateUtilTest() {     }     @BeforeClass     public static void setUpClass() throws Exception {     }     @AfterClass     public static void tearDownClass() throws Exception {     }     @Before     public void setUp() {     }     @After     public void tearDown() {     }     @Test     public void testIsDateBetween() {         System.out.println("isDateBetween()");         Date now = DateUtil.now();         Date startDate = DateUtil.getDatePlusDays(now, -1);         Date endDate = DateUtil.getDatePlusDays(now, 1);         assertTrue(DateUtil.isDateBetween(startDate, endDate, now));     }     /**      * Test of getAsISODateString method, of class DateUtil.      */     @Test     public void testGetAsISODateString() {         System.out.println("getAsISODateString");         Calendar c = Calendar.getInstance();         c.clear();         c.set(Calendar.YEAR, 1979);         c.set(Calendar.MONTH, 1); // 1 means Feb.         c.set(Calendar.DATE, 15);         Date date = c.getTime();         String expResult = "1979-02-15";         String result = DateUtil.getAsISODateString(date);         assertEquals(expResult, result);     }     /**      * Test of getAsISODateTimeString method, of class DateUtil.      */     @Test     public void testGetAsISODateTimeString() {         System.out.println("getAsISODateTimeString");         Calendar c = Calendar.getInstance();         c.clear();         c.set(Calendar.YEAR, 1979);         c.set(Calendar.MONTH, 1); // 1 means Feb.         c.set(Calendar.DATE, 15);         c.set(Calendar.HOUR, 5);         c.set(Calendar.MINUTE, 5);         c.set(Calendar.SECOND, 5);         Date date = c.getTime();         String expResult = "1979-02-15T05:05:05";         String result = DateUtil.getAsISODateTimeString(date);         assertEquals(expResult, result);     }     /**      * Test of getFromISODateString method, of class DateUtil.      */     @Test     public void testGetFromISODateString() {         System.out.println("getFromISODateString");         String dateStr = "1979-02-15";         Calendar c = Calendar.getInstance();         c.clear();         c.set(Calendar.YEAR, 1979);         c.set(Calendar.MONTH, 1); // 1 means Feb.         c.set(Calendar.DATE, 15);         Date expResult = c.getTime();         Date result = DateUtil.getFromISODateString(dateStr);         assertEquals(expResult, result);     }     @Test     public void testGetDatePlusDays() {         System.out.println("getDatePlusDays");                  Calendar c = Calendar.getInstance();         c.clear();         c.set(Calendar.YEAR, 1979);         c.set(Calendar.MONTH, 1); // 1 means Feb.         c.set(Calendar.DATE, 15);         Date date = DateUtil.getDatePlusDays(c.getTime(), 5);         assertEquals(new SimpleDateFormat("dd-MM-yyyy").format(date), "20-02-1979");     }     @Test     public void testGetDateFromString() throws Exception {         Date d = DateUtil.getDateFromString("jan 1, 2010");         assertEquals(new SimpleDateFormat("dd-MM-yyyy").format(d), "01-01-2010");         d = DateUtil.getDateFromString("1-1-2010");         assertEquals(new SimpleDateFormat("dd-MM-yyyy").format(d), "01-01-2010");         d = DateUtil.getDateFromString("1/1/10");         assertEquals(new SimpleDateFormat("dd-MM-yyyy").format(d), "01-01-2010");     } }