Mega Code Archive

 
Categories / Java / Data Type
 

Utilities to working with dates java util Date

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;   }    }