Java tutorial
/* * 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"); } }