Java tutorial
import java.text.DateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; /** * Utilities to working with dates (<tt>java.util.Date</tt>). <p> * * @author Javier Paniza * @author Peter Smith */ public class Dates { /** * With hour to 0. * If day, month and year are 0 return null. */ public static Date create(int day, int month, int year) { return create(day, month, year, 0, 0, 0); } /** * If day, month and year are 0 return null. */ public static Date create(int day, int month, int year, int hourofday, int minute, int second) { if (day == 0 && month == 0 && year == 0) return null; Calendar cal = Calendar.getInstance(); cal.set(year, month - 1, day, hourofday, minute, second); cal.set(Calendar.MILLISECOND, 0); return cal.getTime(); } /** * Current date without time. */ public static Date createCurrent() { return removeTime(new java.util.Date()); } /** * Returns the day of date. <p> * * If date is null return 0. */ public static int getDay(Date date) { if (date == null) return 0; Calendar cal = Calendar.getInstance(); cal.setTime(date); return cal.get(Calendar.DAY_OF_MONTH); } /** * Returns the year (4 digits) of date. <o> * * If date is null returns 0. */ public static int getYear(Date date) { if (date == null) return 0; Calendar cal = Calendar.getInstance(); cal.setTime(date); return cal.get(Calendar.YEAR); } /** * Returns the month (1 to 12) of date. <p> * * If date is null returns 0. */ public static int getMonth(Date date) { if (date == null) return 0; Calendar cal = Calendar.getInstance(); cal.setTime(date); return cal.get(Calendar.MONTH) + 1; } /** * Put the day to the date. <p> * * If date is null it has no effect (but no exception is thrown) */ public static void setDay(Date date, int day) { if (date == null) return; Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.set(Calendar.DAY_OF_MONTH, day); } /** * Put the month (1 to 12) to the date. <p> * * If date is null it has no effect (but no exception is thrown) */ public static void setMonth(Date date, int month) { if (date == null) return; Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.set(Calendar.MONTH, month - 1); } /** * Put the year to the date. <p> * * If date is null it has no effect (but no exception is thrown) */ public static void setYear(Date date, int year) { if (date == null) return; Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.set(Calendar.YEAR, year); } /** * Puts hours, minutes, seconds and milliseconds to zero. <p> * * @return The same date sent as argument (a new date is not created). If null * if sent a null is returned. */ public static Date removeTime(Date date) { if (date == null) return null; Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); date.setTime(cal.getTime().getTime()); return date; } /** * Returns a clone but without hours, minutes, seconds and milliseconds. <p> * * @return If null if sent a null is returned. */ public static Date cloneWithoutTime(Date date) { if (date == null) return null; Date result = (Date) date.clone(); removeTime(result); return result; } /** * Returns a clone but with 23:59:59:999 for hours, minutes, seconds and milliseconds. <p> * * @return The same date sent as argument (a new date is not created). If null * if sent a null is returned. */ public static Date cloneWith2359(Date date) { if (date == null) return null; Date result = (Date) date.clone(); Calendar cal = Calendar.getInstance(); cal.setTime(result); cal.set(Calendar.HOUR_OF_DAY, 23); cal.set(Calendar.MINUTE, 59); cal.set(Calendar.SECOND, 59); cal.set(Calendar.MILLISECOND, 999); result.setTime(cal.getTime().getTime()); return result; } /** * Creates a java.sql.Date from a java.util.Date. <p> * * @param date If null returns null */ public static java.sql.Date toSQL(java.util.Date date) { if (date == null) return null; return new java.sql.Date(date.getTime()); } /** * Creates a date with day, month and year of original, * but with current time. <p> * * @param date It is not changed * @return If arguments is null then is null */ public static java.util.Date withTime(java.util.Date date) { if (date == null) return null; Calendar cal = Calendar.getInstance(); cal.setTime(date); int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH); int day = cal.get(Calendar.DAY_OF_MONTH); cal.setTime(new java.util.Date()); cal.set(Calendar.YEAR, year); cal.set(Calendar.MONTH, month); cal.set(Calendar.DAY_OF_MONTH, day); return cal.getTime(); } /** * Compares if 2 dates are equals at day, month and year * level, ignoring time in comparing. * * @param f1 Can be null * @param f2 Can be null */ public static boolean isDifferentDay(java.util.Date f1, java.util.Date f2) { if (f1 == null && f2 == null) return false; if (f1 == null || f2 == null) return true; Calendar cal = Calendar.getInstance(); cal.setTime(f1); int dd1 = cal.get(Calendar.DAY_OF_MONTH); int mm1 = cal.get(Calendar.MONTH); int aa1 = cal.get(Calendar.YEAR); cal.setTime(f2); int dd2 = cal.get(Calendar.DAY_OF_MONTH); int mm2 = cal.get(Calendar.MONTH); int aa2 = cal.get(Calendar.YEAR); return !(aa1 == aa2 && mm1 == mm2 && dd1 == dd2); } /** * Difference of 2 dates in years, months and days. <p> * * @param f1 If null returns null * @param f2 If null returns null */ public static DateDistance dateDistance(java.util.Date f1, java.util.Date f2, boolean includeStartDate) { DateDistance df = new DateDistance(); if (null == f1 || null == f2) return null; Calendar fmax = Calendar.getInstance(), fmin = Calendar.getInstance(); f1 = Dates.removeTime(f1); f2 = Dates.removeTime(f2); if (f1.after(f2)) { fmax.setTime(f1); fmin.setTime(f2); } else { fmin.setTime(f1); fmax.setTime(f2); } int initDay = fmin.get(Calendar.DATE); int initMonth = fmin.get(Calendar.MONTH); int initYear = fmin.get(Calendar.YEAR); int endMonth = fmax.get(Calendar.MONTH); int endYear = fmax.get(Calendar.YEAR); int finalLimit = fmax.getActualMaximum(Calendar.DATE); int initPeak = 0; int finalPeak = 0; if (initMonth == endMonth && initYear == endYear) { while (fmin.getTime().before(fmax.getTime())) { fmin.add(Calendar.DATE, 1); df.days++; } if (includeStartDate) { df.days++; } if (df.days >= finalLimit) { df.months++; df.days = 0; } return df; } if (initDay != 1) { while (fmin.get(Calendar.DATE) != 1) { fmin.add(Calendar.DATE, 1); initPeak++; } } while (fmin.get(Calendar.MONTH) != endMonth || fmin.get(Calendar.YEAR) != endYear) { fmin.add(Calendar.MONTH, 1); df.months++; if (df.months == 12) { df.years++; df.months = 0; } } while (fmin.getTime().before(fmax.getTime())) { fmin.add(Calendar.DATE, 1); finalPeak++; } int peak = initPeak + finalPeak; if (includeStartDate) { peak++; } if (peak >= finalLimit) { peak = peak - finalLimit; df.months++; if (df.months == 12) { df.years++; df.months = 0; } } df.days = peak; return df; } /** * Difference of 2 dates in years, months and days. <p> * * @param f1 If null returns null * @param f2 If null returns null */ public static DateDistance dateDistance(java.util.Date f1, java.util.Date f2) { return dateDistance(f1, f2, false); } public static DateDistance addDateDistances(DateDistance dis1, DateDistance dis2) { DateDistance df = new DateDistance(); if (null == dis1 || null == dis2) return null; int years, months, days; days = dis1.days + dis2.days; months = days / 30; days = days % 30; months = months + dis1.months + dis2.months; years = months / 12; months = months % 12; years = years + (dis1.years + dis2.years); df.years = years; df.months = months; df.days = days; return df; } public static DateDistance subtractDateDistances(DateDistance dis1, DateDistance dis2) { DateDistance df = new DateDistance(); if (null == dis1 || null == dis2) return null; int years = 0; int months = 0; int days = 0; days = dis1.days - dis2.days; months = dis1.months - dis2.months; years = dis1.years - dis2.years; if (days < 0) { days = days + 30; months = months - 1; } if (months < 0) { months = months + 12; years = years - 1; } df.years = years; df.months = months; df.days = days; return df; } public static String dateFormatForJSCalendar(Locale locale) { DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale); String date = df.format(create(1, 2, 1971)); // d, m, y boolean always4InYear = "es".equals(locale.getLanguage()) || "pl".equals(locale.getLanguage()); String result = date.replaceAll("01", "%d").replaceAll("02", "%m").replaceAll("1971", "%Y") .replaceAll("71", always4InYear ? "%Y" : "%y").replaceAll("1", "%d").replaceAll("2", "%m"); return result; } public static String dateTimeFormatForJSCalendar(Locale locale) { DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, locale); String datetime = df.format(create(1, 2, 1971, 15, 59, 0)); // d, m, y, hr, min, sec boolean always4InYear = "es".equals(locale.getLanguage()) || "pl".equals(locale.getLanguage()); String result = datetime. // time part replaceAll("15", "%H"). // 24hr format replaceAll("03", "%I"). // 12hr format - double digit replaceAll("3", "%l"). // 12hr format - single digit replaceAll("59", "%M"). // minute replaceAll("PM", "%p"). // AM/PM - uppercase replaceAll("pm", "%P"). // am/pm - lowercase // date part replaceAll("01", "%d"). // day - double digit replaceAll("02", "%m"). // month - double digit replaceAll("1971", "%Y"). // year - 4 digit replaceAll("71", always4InYear ? "%Y" : "%y"). // year - 2 digit replaceAll("1", "%e"). // day - single digit replaceAll("2", "%m") // month - ??? seems only double digit is supported by calendar ; return result; } /** * Returns number of days between startDate and endDate<p> * * @param java.util.Date startDate * @param java.util.Date endDate * @param boolean includeStartDate<p> * */ public static int daysInterval(Date startDate, Date endDate, boolean includeStartDate) { startDate = Dates.removeTime(startDate); Calendar start = Calendar.getInstance(); start.setTime(startDate); endDate = Dates.removeTime(endDate); Calendar end = Calendar.getInstance(); end.setTime(endDate); if (includeStartDate) { start.add(Calendar.DATE, -1); } int days = 0; while (start.before(end)) { days++; start.add(Calendar.DATE, 1); } return days; } public static class DateDistance { public int days; public int months; public int years; } }