package com.gffny.ldrbrd.common.utils; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Comparator; import java.util.Date; import javax.xml.datatype.XMLGregorianCalendar; import org.apache.commons.lang.time.DateFormatUtils; import org.apache.commons.lang.time.FastDateFormat; import org.joda.time.DateTime; import org.joda.time.Interval; import org.joda.time.Years; public class DateUtils extends org.apache.commons.lang.time.DateUtils { public static final ThreadLocal<SimpleDateFormat> TIME_FORMAT_TL = new ThreadLocal<SimpleDateFormat>() { @Override protected SimpleDateFormat initialValue() { return new SimpleDateFormat("HHmm"); } }; public static final ThreadLocal<SimpleDateFormat> OUTPUT_MONTH_DAY_TIME_FORMAT_TL = new ThreadLocal<SimpleDateFormat>() { @Override protected SimpleDateFormat initialValue() { return new SimpleDateFormat("MMMM d 'at' h:mm a"); } }; public static final ThreadLocal<SimpleDateFormat> FULL_DATE_TIME_FORMAT_TL = new ThreadLocal<SimpleDateFormat>() { @Override protected SimpleDateFormat initialValue() { return new SimpleDateFormat("MMM dd, yyyy HH:mm:ss z"); } }; public static final ThreadLocal<SimpleDateFormat> FULL_DATE_TIME_FORMAT_SSO = new ThreadLocal<SimpleDateFormat>() { @Override protected SimpleDateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd+HH:mm:ss"); } }; public static final FastDateFormat CHART_DATE_FORMAT = FastDateFormat.getInstance("MM/dd/yyyy"); public static final FastDateFormat MYSQL_DATE_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd"); public static final FastDateFormat LOG_DATE_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss"); public static final int DAYS_PER_WEEK = 7; private static String WEEK = "week"; private static String MONTH = "month"; private static String YEAR = "year"; public static final Comparator<Date> SAME_DAY_COMPARATOR = new Comparator<Date>() { public int compare(Date lhs, Date rhs) { if (DateUtils.isSameDay(lhs, rhs)) { return 0; } return lhs.compareTo(rhs); } }; public static Calendar toCalendar(Date date) { if (date == null) { return null; } Calendar c = Calendar.getInstance(); c.setTime(date); return c; } /** * <p> * Checks if two date objects are in the same year ignoring time. * </p> * * <p> * 28 Mar 2002 13:45 and 12 Mar 2002 06:01 would return true. 28 Mar 2002 * 13:45 and 12 Mar 2005 02:45 would return false. * </p> * * @param date1 * the first date, not altered, not null * @param date2 * the second date, not altered, not null * @return true if they represent the same day * @throws IllegalArgumentException * if either date is <code>null</code> * @since 2.1 */ public static boolean isSameYear(Date date1, Date date2) { if (date1 == null || date2 == null) { throw new IllegalArgumentException("The date must not be null"); } Calendar cal1 = Calendar.getInstance(); cal1.setTime(date1); Calendar cal2 = Calendar.getInstance(); cal2.setTime(date2); return isSameYear(cal1, cal2); } /** * <p> * Checks if two calendar objects are in the same year ignoring time. * </p> * * <p> * 28 Mar 2002 13:45 and 12 Mar 2002 06:01 would return true. 28 Mar 2002 * 13:45 and 12 Mar 2005 02:45 would return false. * </p> * * @param cal1 * the first calendar, not altered, not null * @param cal2 * the second calendar, not altered, not null * @return true if they represent the same day * @throws IllegalArgumentException * if either calendar is <code>null</code> * @since 2.1 */ public static boolean isSameYear(Calendar cal1, Calendar cal2) { if (cal1 == null || cal2 == null) { throw new IllegalArgumentException("The calendar must not be null"); } return (cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA) && cal1 .get(Calendar.YEAR) == cal2.get(Calendar.YEAR)); } public static boolean safeIsSameDay(Date date1, Date date2) { try { return DateUtils.isSameDay(date1, date2); } catch (Throwable ex) { return false; } } public static boolean safeIsSameDay(Calendar cal1, Calendar cal2) { try { return DateUtils.isSameDay(cal1, cal2); } catch (Throwable ex) { return false; } } /** * Useful for determining if a date is between the start and end date (or * effective and expiration date). * * @param startDate * @param endDate * @return */ public static boolean isTodayInRange(Date startDate, Date endDate) { if (startDate == null || endDate == null) { return false; } return isDateInRange(Calendar.getInstance().getTime(), startDate, DateUtils.addDays(endDate, 1)); } public static boolean isDateNotInRange(Date date, Date startDate, Date endDate) { return !isDateInRange(date, startDate, endDate); } public static boolean isDateInRange(Date date, Date startDate, Date endDate) { if (date == null || startDate == null || endDate == null) { return false; } endDate = DateUtils.getEndOfDay(endDate); if (startDate.after(date)) { return false; } if (endDate.before(date)) { return false; } return true; } public static boolean isDateInRangeOrNull(Date date, Date startDate, Date endDate) { if (date == null) { return false; } if (startDate != null) { if (date.before(startDate)) { return false; } } if (endDate != null) { if (date.after(endDate)) { return false; } } return true; } public static boolean isFutureDate(Date date) { if (date == null) { return false; } Date today = DateUtils.truncate(Calendar.getInstance(), Calendar.DATE) .getTime(); if (date.after(today)) { return true; } return false; } public static boolean isPastDate(Date date) { if (date == null) { return false; } if (isToday(date)) { return false; } Date today = DateUtils.truncate(Calendar.getInstance(), Calendar.DATE) .getTime(); if (date.before(today)) { return true; } return false; } public static boolean isToday(Date date) { if (date == null) { return false; } return isSameDay(date, new Date()); } public static boolean isNotToday(Date date) { return !isToday(date); } public static boolean isAfter(Date startDate, Date endDate) { if (startDate == null) { return false; } if (endDate == null) { return false; } return endDate.after(startDate); } public static boolean isBefore(Date startDate, Date endDate) { if (startDate == null) { return false; } if (endDate == null) { return false; } return endDate.before(startDate); } public static boolean isAfterToday(Date date) { return DateUtils.isAfter(new Date(), date) && DateUtils.isNotToday(date); } public static boolean isYesterday(Date date) { if (date == null) { return false; } return isSameDay(date, addDays(-1)); } public static boolean isThisWeek(Date date) { if (date == null) { return false; } DateTime dt = new DateTime(date); DateTime current = new DateTime(); return dt.getYear() == current.getYear() && dt.getWeekOfWeekyear() == current.getWeekOfWeekyear(); } public static boolean isThisMonth(Date date) { if (date == null) { return false; } DateTime dt = new DateTime(date); DateTime current = new DateTime(); return dt.getYear() == current.getYear() && dt.getMonthOfYear() == current.getMonthOfYear(); } public static boolean isThisYear(Date date) { if (date == null) { return false; } return isSameYear(date, new Date()); } public static Date addDays(int days) { return addDays(new Date(), days); } public static Date addWeeks(int weeks) { return addWeeks(new Date(), weeks); } public static Date addMonths(int months) { return addMonths(new Date(), months); } public static Date addHours(int hours) { return addHours(new Date(), hours); } public static Date addMinutes(int minutes) { return addMinutes(new Date(), minutes); } /* * public static Date maxNotNull(Date... dates) { Date max = null; * * if (CollectionUtils.isNotEmpty(dates)) { for (Date date : dates) { if * (date == null) continue; * * if (max == null || date.after(max)) { max = date; } } } * * return clone(max); } * * public static Date minNotNull(Date... dates) { Date min = null; * * if (CollectionUtils.isNotEmpty(dates)) { for (Date date : dates) { if * (date == null) { continue; } * * if (min == null || date.before(min)) { min = date; } } } * * return clone(min); } */ public static Date clone(Date date) { if (date == null) return null; return (Date) date.clone(); } public static Date getToday() { return getBeginningOfDay(new Date()); } public static Date getYesterday() { return getBeginningOfDay(addDays(-1)); } public static Date getTomorrow() { return getBeginningOfDay(addDays(1)); } public static Date getBeginningOfDay(Date date) { if (date == null) { return null; } Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTime(); } public static Date getEndOfDay(Date date) { if (date == null) { return null; } Calendar cal = Calendar.getInstance(); cal.setTime(date); return getEndOfDay(cal).getTime(); } public static Calendar getEndOfDay(Calendar input) { if (input == null) { return null; } Calendar cal = (Calendar) input.clone(); cal.setTime(cal.getTime()); cal.add(Calendar.DATE, 1); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, -1); return cal; } public static Date subtract1Millisecond(Date date) { if (date == null) { return null; } Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.MILLISECOND, -1); return calendar.getTime(); } /** * @param o * Must be of type XMLGregorianCalendar, Calendar, or Date */ public static final String formatMessageDate(Object o) { Calendar c = null; if (o instanceof XMLGregorianCalendar) { c = ((XMLGregorianCalendar) o).toGregorianCalendar(); } else if (o instanceof Date) { c = Calendar.getInstance(); c.setTime((Date) o); } else { c = (Calendar) o; } Calendar today = Calendar.getInstance(); if (DateUtils.isSameDay(c, today)) { return DateFormatUtils.format(c, "h:mm a").toLowerCase(); } else if (DateUtils.isSameYear(c, today)) { return DateFormatUtils.format(c, "MMM d"); } return DateFormatUtils.format(c, "MM/dd/yy"); } public static String formatActivityTime(Date activityDate) { return format(activityDate, TIME_FORMAT_TL.get()); } public static String formatActivityDateAndTime(Date activityDate) { return format(activityDate, OUTPUT_MONTH_DAY_TIME_FORMAT_TL.get()); } public static String formatChartDate(Date date) { return CHART_DATE_FORMAT.format(date); } public static String formatChartDate(Calendar calendar) { return CHART_DATE_FORMAT.format(calendar); } private static String format(Date activityDate, DateFormat defaultFormat) { try { Calendar calendar = Calendar.getInstance(); calendar.setTime(activityDate); Calendar today = Calendar.getInstance(); today.setTime(new Date()); if (isToday(activityDate)) { long diff = today.getTimeInMillis() - calendar.getTimeInMillis(); long minDiff = diff / (1000 * 60); if (minDiff < 60) { if (minDiff <= 1) return new StringBuilder().append("Moments Ago") .toString(); else return new StringBuilder().append(minDiff) .append(" Minutes Ago").toString(); } else { long hourDiff = minDiff / 60; if (hourDiff <= 1) return new StringBuilder().append("1 Hour Ago") .toString(); else return new StringBuilder().append(hourDiff) .append(" Hours Ago").toString(); } } return defaultFormat.format(activityDate); } catch (Throwable ex) { return ""; } } public static String format(Date date, String pattern) { try { return new SimpleDateFormat(pattern).format(date); } catch (Throwable ex) { return ""; } } public static int getDaysRemaining(Date date) { if (date == null) { return 0; } Calendar today = DateUtils.truncate(Calendar.getInstance(), Calendar.DATE); if (date.before(today.getTime())) { return 0; } Calendar end = Calendar.getInstance(); end.setTime(date); end = DateUtils.truncate(end, Calendar.DATE); // get positive value so that the difference is calculated as positive // number. return (int) (Math.abs(today.getTimeInMillis() - end.getTimeInMillis()) / MILLIS_PER_DAY); } public static int getDaysBeforeStart(Date date) { return getDaysBetween(new Date(), date); } public static int getDaysPassed(Date date) { return getDaysBetween(date, new Date()); } public static int getDaysBetween(Date date1, Date date2) { if (date1 == null || date2 == null) { return 0; } date1 = DateUtils.truncate(date1, Calendar.DATE); date2 = DateUtils.truncate(date2, Calendar.DATE); if (date1.after(date2)) { return 0; } // get positive value so that the difference is calculated as positive // number. return (int) (Math.abs(date2.getTime() - date1.getTime()) / MILLIS_PER_DAY); } public static Date randomDate(Date startDate, Date endDate) { Calendar start = Calendar.getInstance(); start.setTime(startDate); Calendar end = Calendar.getInstance(); end.setTime(endDate); int year = randomBetween(start.get(Calendar.YEAR), end.get(Calendar.YEAR)); int dayOfYear = randomBetween(start.get(Calendar.DAY_OF_YEAR), end.get(Calendar.DAY_OF_YEAR)); System.out.println("Year:" + year); System.out.println("Day of Year:" + dayOfYear); Calendar random = Calendar.getInstance(); random.set(Calendar.YEAR, year); random.set(Calendar.DAY_OF_YEAR, dayOfYear); return random.getTime(); } protected static int randomBetween(int start, int end) { return start + (int) Math.round(Math.random() * (end - start)); } public static double getTimeUnitCount(String timeUnit, int numberOfDays) { if (timeUnit.equals(WEEK)) return getWeeksIn(numberOfDays); else if (timeUnit.equals(MONTH)) return getMonthsIn(numberOfDays); if (timeUnit.equals(YEAR)) return getYearsIn(numberOfDays); else return numberOfDays; } public static int getTimeUnitCountRounded(String timeUnit, int numberOfDays) { double units = getTimeUnitCount(timeUnit, numberOfDays); return new Double(units).intValue(); } public static double getMonthsIn(int numberOfDays) { return (double) numberOfDays / 30D; } public static double getWeeksIn(int numberOfDays) { return (double) numberOfDays / 7D; } public static double getYearsIn(int numberOfDays) { return (double) numberOfDays / 365D; } public static int getAge(Date birthDate) { DateTime today = new DateTime(getToday()).dayOfYear().roundFloorCopy(); DateTime dob = new DateTime(birthDate).dayOfYear().roundFloorCopy(); return Years.yearsBetween(dob, today).getYears(); } /** * Day of Week starts at 1 for Monday and ends with 7 for Sunday. */ public int getDayOfWeek(Date date) { DateTime dateTime = new DateTime(date); return dateTime.getDayOfWeek(); } public static int compare(Date lhs, Date rhs, boolean nullIsBOT) { if (lhs == rhs) { // both null return 0; } if (lhs == null) { return nullIsBOT ? -1 : 1; } if (rhs == null) { return nullIsBOT ? 1 : -1; } return lhs.compareTo(rhs); } public static Date parseDateOrNull(String str, String parsePattern) { return parseDateOrNull(str, new String[] { parsePattern }); } public static Date parseDateOrNull(String str, String[] parsePatterns) { try { return parseDate(str, parsePatterns); } catch (Throwable e) { return null; } } public static String formatSSODate(Date date) { return format(date, FULL_DATE_TIME_FORMAT_SSO.get()); } public static boolean isNotSameDay(Date date1, Date date2) { return !DateUtils.isSameDay(date1, date2); } public static boolean isNotSameDay(Calendar cal1, Calendar cal2) { return !DateUtils.isSameDay(cal1, cal2); } public static boolean isNotSameYear(Date date1, Date date2) { return !DateUtils.isNotSameYear(date1, date2); } public static boolean isNotSameYear(Calendar cal1, Calendar cal2) { return !DateUtils.isNotSameYear(cal1, cal2); } public static boolean isInBetween(Date date1, Date date2, Date input) { return DateUtils.isOnOrAfter(date1, input) && DateUtils.isOnOrBefore(date2, input); } public static boolean isNotInBetween(Date date1, Date date2, Date input) { return !isInBetween(date1, date2, input); } public static boolean isOnOrBefore(Date startDate, Date endDate) { return isBefore(startDate, endDate) || isSameDay(startDate, endDate); } public static boolean isOnOrAfter(Date startDate, Date endDate) { return isAfter(startDate, endDate) || isSameDay(startDate, endDate); } public static Date parseDate(int month, int dayOfMonth) { try { Calendar cal = Calendar.getInstance(); DateTime current = new DateTime(); cal.set(current.getYear(), month, dayOfMonth); return cal.getTime(); } catch (Throwable ex) { return null; } } public static Date nextDateThanToday(int month, int dayOfMonth) { try { Calendar cal = Calendar.getInstance(); DateTime current = new DateTime(); cal.set(current.getYear(), month, dayOfMonth); if (isBefore(cal.getTime(), current.toDate())) { return cal.getTime(); } else { cal = Calendar.getInstance(); cal.set(current.getYear() + 1, month, dayOfMonth); return cal.getTime(); } } catch (Throwable ex) { return null; } } public static int getDaysInTimeUnit(String timeUnit) { if (timeUnit.equals(WEEK)) return 7; else return 1; } public static boolean contains(Interval interval, Date date) { if (interval == null || date == null) { return false; } return interval.contains(date.getTime()); } public static boolean contains(Interval interval, DateTime dateTime) { if (interval == null || dateTime == null) { return false; } return interval.contains(dateTime.getMillis()); } /** * Here the assumption is that the week starts from Monday to Sunday * * @return */ public static Date getBeginningOfWeek() { Date date = getToday(); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); return calendar.getTime(); } public static Date getBeginningOfQuarter() { Date date = getToday(); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int month = calendar.get(Calendar.MONTH); calendar.set(Calendar.MONTH, month - (month % 3)); calendar.set(Calendar.DAY_OF_MONTH, 1); return calendar.getTime(); } public static Date getBeginningOfMonth() { Date date = getToday(); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.DAY_OF_MONTH, 1); return calendar.getTime(); } public static Date getBeginningOfYear() { Date date = getToday(); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.DAY_OF_MONTH, 1); calendar.set(Calendar.MONTH, Calendar.JANUARY); return calendar.getTime(); } public static Date getEndOfYear() { Date date = getEndOfDay(new Date()); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.DAY_OF_MONTH, 31); calendar.set(Calendar.MONTH, Calendar.DECEMBER); return calendar.getTime(); } public static Date getEndOfMonth() { Date date = getEndOfDay(new Date()); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); calendar.set(Calendar.DAY_OF_MONTH, lastDay); return calendar.getTime(); } public static Date getEndOfQuarter() { Date date = getEndOfDay(new Date()); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int month = calendar.get(Calendar.MONTH); calendar.set(Calendar.MONTH, month + (2 - (month % 3))); calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); return calendar.getTime(); } public static Date getEndOfWeek() { Date date = getEndOfDay(new Date()); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.WEEK_OF_YEAR, calendar.get(Calendar.WEEK_OF_YEAR) + 1); calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); return calendar.getTime(); } public static int getDayofDate(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.DATE); } public static int getMonthofDate(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.MONTH); } public static int getYearofDate(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.YEAR); } public static boolean isAfterOrEqualTo(Date date, Date dateToCompare) { if (date.after(dateToCompare) || date.equals(dateToCompare)) { return true; } return false; } public static boolean isBeforeOrEqualTo(Date date, Date dateToCompare) { if (date.before(dateToCompare) || date.equals(dateToCompare)) { return true; } return false; } public static int getYearIntervalBetweenDates(Date startDate, Date endDate) { int years = -1; if (startDate != null && endDate != null) { Calendar calendar1 = Calendar.getInstance(); calendar1.setTime(startDate); Calendar calendar2 = Calendar.getInstance(); calendar2.setTime(endDate); years = calendar2.get(Calendar.YEAR) - calendar1.get(Calendar.YEAR); } return years; } public static int getYear(Date dateToUse) { int year = -1; if (dateToUse != null) { Calendar calendar1 = Calendar.getInstance(); calendar1.setTime(dateToUse); year = calendar1.get(Calendar.YEAR); } return year; } }