/* * DateUtils.java * */ package org.smartly.commons.util; import java.text.DateFormatSymbols; import java.util.*; /** * @author */ public abstract class DateUtils { // measure unit /** * Milliseconds=14 * */ public static final int MILLISECOND = Calendar.MILLISECOND; // 14 /** * Seconds=13 * */ public static final int SECOND = Calendar.SECOND; // 13 /** * Minute=12 * */ public static final int MINUTE = Calendar.MINUTE; // 12 /** * Hour=11 * */ public static final int HOUR = Calendar.HOUR_OF_DAY; // 11 /** * Day=5 * */ public static final int DAY = Calendar.DAY_OF_MONTH; // 5 /** * MONTH=2 * */ public static final int MONTH = Calendar.MONTH; // 2 /** * Year=1 * */ public static final int YEAR = Calendar.YEAR; // 1 /** * Infinite year (3000) * */ public static final int INFINITE_YEAR = 3000; /** * Zero year (1900) * */ public static final int ZERO_YEAR = 1900; /** * no-working days */ private static final int[] highDays = {Calendar.SUNDAY, Calendar.SATURDAY}; /** * Return number of milliseconds in measure unit and multiplied for passed value. * Useful to get, for example, 35 minutes in milliseconds: milliseconds (35, DateUtils.MINUTES); * @param value number of measure unit * @param measureUnit MILLISECOND, SECOND, MINUTE, HOUR, DAY * @return */ public static long milliseconds(final int value, int measureUnit) { long result = value; switch (measureUnit) { case MILLISECOND: result = value; break; case SECOND: result = value * 1000; break; case MINUTE: result = value * 1000 * 60; break; case HOUR: result = value * 1000 * 60 * 60; break; case DAY: result = value * 1000 * 60 * 60 *24; break; } return result; } /** * Return a date. * * @param year Year * @param month Month. 1 is January * @param day Day * @param hour Hour * @param minutes Minutes * @param seconds Seconds * @return A valid date */ public static Date encodeDateTime(int year, int month, int day, int hour, int minutes, int seconds) { Date result; Calendar calendar = Calendar.getInstance(); calendar.set(year, month - 1, day, hour, minutes, seconds); result = calendar.getTime(); return result; } /** * Calculate difference in milliseconds from 2 dates. * * @param date1 First date * @param date2 Second date * @return Difference between first date and second date in milliseconds */ public static long dateDiff(final Date date1, final Date date2) { long result = date1.getTime() - date2.getTime(); return result; } /** * Calculate difference from 2 dates.<br> * Result is in "measureUnit" measure unit. (Ex: DAY) * * @param date1 First date * @param date2 Second date * @param measureUnit Measure unit. Ex: DateUtility.DAY * @return Difference between first date and second date. */ public static double dateDiff(final Date date1, final Date date2, int measureUnit) { long diff = dateDiff(date1, date2); double result = 0d; switch (measureUnit) { case MILLISECOND: result = (double) diff; break; case SECOND: result = (double) (diff / 1000d); break; case MINUTE: result = (double) (diff / (1000d * 60L)); break; case HOUR: result = (double) (diff / (1000d * 60d * 60d)); break; case DAY: result = (double) (diff / (1000d * 60d * 60d * 24d)); break; } return result; } public static Date postpone(final Date date, final int measureUnit, final int amount) { final Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return postpone(calendar, measureUnit, amount); } public static Date postpone(final Calendar calendar, final int measureUnit, final int amount) { switch (measureUnit) { case MILLISECOND: calendar.add(MILLISECOND, amount); break; case SECOND: calendar.add(SECOND, amount); break; case MINUTE: calendar.add(MINUTE, amount); break; case HOUR: calendar.add(HOUR, amount); break; case DAY: calendar.add(DAY, amount); break; case MONTH: calendar.add(MONTH, amount); break; case YEAR: calendar.add(YEAR, amount); break; } return calendar.getTime(); } public static Date postponeWorkingDay(final Date date, final int measureUnit, final int amount, final Long[] holidays) { Date result = date; for (int i = 0; i < amount; i++) { result = postpone(result, measureUnit, 1); if (!isWorkingDay(result, holidays)) { result = nextWorkingDay(result, holidays).getTime(); } } return result; } public static Date postponeWorkingDay(final Calendar calendar, final int measureUnit, final int amount, final Long[] holidays) { Date result = calendar.getTime(); for (int i = 0; i < amount; i++) { postpone(calendar, measureUnit, 1); if (!isWorkingDay(calendar, holidays)) { nextWorkingDay(calendar, holidays); } } return calendar.getTime(); } public static Date anticipateWorkingDay(final Date date, final int measureUnit, final int amount, final Long[] holidays) { Date result = date; for (int i = 0; i < amount; i++) { result = postpone(result, measureUnit, -1); if (!isWorkingDay(result, holidays)) { result = previousWorkingDay(result, holidays).getTime(); } } return result; } /** * Return true if the day is a working day * * @param date Date * @param holidays Array of holidays * @return Return true if the day is a working day */ public static boolean isWorkingDay(final Date date, final Long[] holidays) { return isWorkingDay(date.getTime(), holidays); } /** * Return true if the day is a working day * * @param time Long - time in milliseconds * @param holidays Array of holidays * @return Return true if the day is a working day */ public static boolean isWorkingDay(final long time, final Long[] holidays) { final Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(time); return isWorkingDay(calendar, holidays); } public static boolean isWorkingDay(final Calendar calendar, final Long[] holidays) { // check if in holiday if (null != holidays) { final Calendar holiday = Calendar.getInstance(); for (final long d : holidays) { holiday.setTimeInMillis(d); if (holiday.get(Calendar.YEAR) == calendar.get(Calendar.YEAR) && holiday.get(Calendar.MONTH) == calendar.get(Calendar.MONTH) && holiday.get(Calendar.DAY_OF_MONTH) == calendar.get(Calendar.DAY_OF_MONTH)) { return false; } } } // check day of week final int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); for (final int i : highDays) { if (i == dayOfWeek) { return false; } } return true; } /** * @param date * @return */ public static Calendar nextWorkingDay(final Date date, final Long[] holidays) { return nextWorkingDay(date.getTime(), holidays); } /** * @param time * @return */ public static Calendar nextWorkingDay(final Long time, final Long[] holidays) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(time); return nextWorkingDay(calendar, holidays); } /** * @param calendar * @param holidays (Optional) Array of holidays * @return */ public static Calendar nextWorkingDay(final Calendar calendar, final Long[] holidays) { // move forward calendar of one day calendar.add(DAY, 1); while (!isWorkingDay(calendar, holidays)) { calendar.add(DAY, 1); } return calendar; } public static Calendar previousWorkingDay(final Date date, final Long[] holidays) { return previousWorkingDay(date.getTime(), holidays); } public static Calendar previousWorkingDay(final Long time, final Long[] holidays) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(time); // move forward calendar of one day calendar.add(DAY, -1); while (!isWorkingDay(calendar.getTimeInMillis(), holidays)) { calendar.add(DAY, -1); } return calendar; } /** * @param calendar * @param holidays (Optional) Array of holidays * @return */ public static Calendar previousWorkingDay(final Calendar calendar, final Long[] holidays) { // move backward calendar of one day calendar.add(DAY, -1); while (!isWorkingDay(calendar.getTimeInMillis(), holidays)) { calendar.add(DAY, -1); } return calendar; } /** * @param startTime * @param endTime * @param holidays (Optional) Array of holidays * @return */ public static Long getWorkingDays(final long startTime, final long endTime, final Long[] holidays) { Calendar startCalendar = Calendar.getInstance(); startCalendar.setTimeInMillis(startTime); Calendar endCalendar = Calendar.getInstance(); endCalendar.setTimeInMillis(endTime); return getWorkingDays(startCalendar, endCalendar, holidays); } /** * @param startDate * @param finalDate * @param holidays (Optional) Array of holidays * @return */ public static Long getWorkingDays(final Date startDate, final Date finalDate, final Long[] holidays) { return getWorkingDays(startDate.getTime(), finalDate.getTime(), holidays); } /** * @param start * @param end * @param holidays (Optional) Array of holidays * @return */ public static Long getWorkingDays(Calendar start, Calendar end, final Long[] holidays) { Long result = 0L; // day of weeks int startDayOfWeek = start.get(Calendar.DAY_OF_WEEK); int endDayOfWeek = end.get(Calendar.DAY_OF_WEEK); // adjust calendars to fist working day if (!isWorkingDay(start.getTime(), holidays)) { start = nextWorkingDay(start, holidays); } if (!isWorkingDay(end.getTime(), holidays)) { end = previousWorkingDay(end, holidays); } // difference in day beetween 2 date Long dayDiff = Math.abs(dateDiff(start.getTime(), end.getTime()) / (1000L * 60L * 60L * 24L)); // number of week-ends in period Long weekEnds = dayDiff / 7; if (startDayOfWeek < endDayOfWeek) { weekEnds++; } result = dayDiff - (weekEnds * highDays.length); return result; } public static Long[] getPeriod(final int startY, final int startM, final int startD, final int endY, final int endM, final int endD) { final Calendar start = Calendar.getInstance(); start.set(startY, startM - 1, startD); final Calendar end = Calendar.getInstance(); end.set(endY, endM - 1, endD); return getPeriod(start, end); } public static Long[] getPeriod(final Date start, final Date end) { final Calendar startCal = Calendar.getInstance(); startCal.setTime(start); final Calendar endCal = Calendar.getInstance(); endCal.setTime(end); return getPeriod(startCal, endCal); } public static Long[] getPeriod(final Calendar startCal, final Calendar endCal) { final List<Long> result = new LinkedList<Long>(); // loop int count = 0; while (true) { if (startCal.getTime().after(endCal.getTime())) { break; } else { result.add(startCal.getTimeInMillis()); } startCal.add(DAY, 1); count++; if (count > 3650) { // 10 years limit break; // avoid infinite loop } } return result.toArray(new Long[result.size()]); } public static boolean equals(final Date date1, final Date date2) { return dateDiff(date1, date2) == 0L; } public static boolean equals(final Date date1, final Date date2, final long tolleranceMs) { return dateDiff(date1, date2) <= tolleranceMs; } public static boolean equalsDay(final Date date1, final Date date2) { final Calendar c1 = Calendar.getInstance(); c1.setTime(date1); final Calendar c2 = Calendar.getInstance(); c2.setTime(date2); return c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR) && c1.get(Calendar.MONTH) == c2.get(Calendar.MONTH) && c1.get(Calendar.DAY_OF_MONTH) == c2.get(Calendar.DAY_OF_MONTH); } public static Date infinite() { Date date = DateUtils.encodeDateTime(INFINITE_YEAR, 1, 1, 0, 0, 0); return date; } public static boolean isInfinite(final Date date) { final int year = DateUtils.getYear(date); final boolean result = year >= INFINITE_YEAR; return result; } public static Date zero() { Date date = DateUtils.encodeDateTime(ZERO_YEAR, 1, 1, 0, 0, 0); return date; } public static boolean isZero(final Date date) { final int year = DateUtils.getYear(date); final boolean result = year <= ZERO_YEAR; return result; } public static Date now() { return new Date(); } public static Date yesterday() { final Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); calendar.add(DAY, -1); // zero time (hour, minutes, seconds, milliseconds) calendar.set(Calendar.HOUR, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTime(); } public static Date today() { final Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); // zero time (hour, minutes, seconds, milliseconds) calendar.set(Calendar.HOUR, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTime(); } public static boolean isToday(final Date date) { final Calendar calendar = Calendar.getInstance(); calendar.setTime(date); final int year = calendar.get(YEAR); final int month = calendar.get(MONTH); final int day = calendar.get(DAY); final Calendar today = Calendar.getInstance(); today.setTime(now()); final int tyear = today.get(YEAR); final int tmonth = today.get(MONTH); final int tday = today.get(DAY); final boolean result = tyear == year && tmonth == month && tday == day; return result; } public static int getMinutes() { Calendar calendar = Calendar.getInstance(); return calendar.get(Calendar.MINUTE); } public static int getMinutes(final Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.MINUTE); } public static int getSeconds() { Calendar calendar = Calendar.getInstance(); return calendar.get(Calendar.SECOND); } public static int getSeconds(final Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.SECOND); } public static int getHourOfDay() { Calendar calendar = Calendar.getInstance(); return calendar.get(Calendar.HOUR_OF_DAY); } public static int getHourOfDay(final Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.HOUR_OF_DAY); } public static int getDayOfMonth() { Calendar calendar = Calendar.getInstance(); return calendar.get(Calendar.DAY_OF_MONTH); } public static int getDayOfMonth(final Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.DAY_OF_MONTH); } public static int getMonth() { Calendar calendar = Calendar.getInstance(); return calendar.get(Calendar.MONTH) + 1; } public static int getMonth(final Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.MONTH) + 1; } public static String getMonthAsString(final Date date) { return DateUtils.getMonthAsString(DateUtils.getMonth(date)); } public static String getMonthAsString(final int month) { final DateFormatSymbols dfs = new DateFormatSymbols(); final String[] months = dfs.getMonths(); return months[month - 1]; } public static String getMonthAsString(final Date date, final Locale locale) { return DateUtils.getMonthAsString(DateUtils.getMonth(date), locale); } public static String getMonthAsString(final int month, final Locale locale) { final DateFormatSymbols dfs = new DateFormatSymbols(locale); final String[] months = dfs.getMonths(); return months[month - 1]; } public static String getShortMonthAsString(final Date date) { return DateUtils.getShortMonthAsString(DateUtils.getMonth(date)); } public static String getShortMonthAsString(final int month) { final DateFormatSymbols dfs = new DateFormatSymbols(); final String[] months = dfs.getShortMonths(); return months[month - 1]; } public static String getShortMonthAsString(final Date date, final Locale locale) { return DateUtils.getShortMonthAsString(DateUtils.getMonth(date), locale); } public static String getShortMonthAsString(final int month, final Locale locale) { final DateFormatSymbols dfs = new DateFormatSymbols(locale); final String[] months = dfs.getShortMonths(); return months[month - 1]; } public static int getYear() { Calendar calendar = Calendar.getInstance(); return calendar.get(Calendar.YEAR); } public static int getYear(final Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.YEAR); } /** * Return maximun number of days in month. * * @param date * @return */ public static int getActualMaximumDayOfMonth(final Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.getActualMaximum(Calendar.DAY_OF_MONTH); } }