Java/Database SQL JDBC/Date Time Timestamp

Материал из Java эксперт
Перейти к: навигация, поиск

Compare two times

   <source lang="java">
 

/**

* Copyright (c) 2003 - 2007 OpenSubsystems s.r.o. Slovak Republic. All rights reserved.
* 
* Project: OpenSubsystems
* 
* $Id: DateUtils.java,v 1.7 2007/01/07 06:14:00 bastafidli Exp $
* 
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License. 
* 
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
* 
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
*/

import java.sql.Timestamp; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar;

/**

* Collection of useful utilities to work with dates. 
* 
* @version $Id: DateUtils.java,v 1.7 2007/01/07 06:14:00 bastafidli Exp $
* @author Miro Halas
* @code.reviewer Miro Halas
* @code.reviewed 1.5 2005/09/13 13:23:15 bastafidli
*/

public final class DateUtils {

  // Constants ////////////////////////////////////////////////////////////////
  
  /**
   * One second in milliseconds.
   */
  public static final long ONE_SECOND = 1000L;
  
  /**
   * One minute in milliseconds.
   */
  public static final long ONE_MINUTE = ONE_SECOND * 60L;
  
  /**
   * One hour in milliseconds.
   */
  public static final long ONE_HOUR = ONE_MINUTE * 60L;
  
  /**
   * One day in milliseconds.
   */
  public static final long ONE_DAY = ONE_HOUR * 24L;
  
  /**
   * Separator we used to separate time from the nanosecond portion of the 
   * timestamp when converted to string.
   */
  public static final char NANO_SEPARATOR = ":";
  
  /**
   * Constant for timing type
   */
  public static final int TIMING_NEVER = 0;
  /**
   * Constant for timing type
   */
  public static final int TIMING_MINUTES = 1;
  /**
   * Constant for timing type
   */
  public static final int TIMING_HOURS = 2;
  /**
   * Constant for timing type
   */
  public static final int TIMING_DAYS = 3;
  /**
   * Constant for timing type
   */
  public static final int TIMING_WEEKS = 4;
  /**
   * Constant for timing type
   */
  public static final int TIMING_MONTHS = 5;
  /**
   * Constant for timing type
   */
  public static final int TIMING_YEARS = 6;
  
  /**
   * Constant for timing type
   */
  public static final int TIMING_NONE = 7;
  /**
   * Constant for current date code used in date/time formulas 
   */
  public static final String CURRENT_DATE_CODE = "now";
  
  /**
   * Constant for dynamic date code used in date/time formulas
   */
  public static final char YEAR_CODE = "y";
  
  /**
   * Constant for dynamic date code used in date/time formulas
   */
  public static final char MONTH_CODE = "M";
  /**
   * Constant for dynamic date code used in date/time formulas
   */
  public static final char WEEK_CODE = "w";
  /**
   * Constant for dynamic date code used in date/time formulas
   */
  public static final char DAY_CODE = "d";
  /**
   * Constant for dynamic date code used in date/time formulas
   */
  public static final char HOUR_CODE = "h";
  /**
   * Constant for dynamic date code used in date/time formulas
   */
  public static final char MINUTE_CODE = "m";
  
  /**
   * Constant for dynamic date code used in date/time formulas
   */
  public static final char SECOND_CODE = "s";
  /**
   * constant for date type DATE
   */
  public static final int DATE_TYPE_DATE = 1;
  /**
   * constant for date type TIME
   */
  public static final int DATE_TYPE_TIME = 2;
  /**
   * constant for date type DATETIME
   */
  public static final int DATE_TYPE_DATETIME = 3;
  
  // Constants for period start types /////////////////////////////////////////

// TODO: For Miro: Remove this code once all the code which referred to these // constants was fixed // /** // * constant for period type // */ // public static final int PERIOD_START_TYPE_NONE = 0; // // /** // * constant for period type // */ // public static final int PERIOD_START_TYPE_CREATION = 1; // // /** // * constant for period type // */ // public static final int PERIOD_START_TYPE_COMPLETION = 2; // // /** // * constant for period type // */ // public static final int PERIOD_START_TYPE_APPROVAL = 3; // // /** // * constant for period type // */ // public static final int PERIOD_START_TYPE_ACTIVATION = 4; // // /** // * constant for period type // */ // public static final int PERIOD_START_TYPE_INACTIVATION = 5; // // /** // * constant for period type // */ // public static final int PERIOD_START_TYPE_DYNAMIC = 6; // // /** // * constant for period type code // */ // public static final int PERIOD_TYPE_CODE = 99; // // /** // * constant for period type object // */ // public static final Integer PERIOD_TYPE_OBJ = new Integer(PERIOD_TYPE_CODE);

  // Cached variables /////////////////////////////////////////////////////////
  
  /**
   * static SimpleDateFormat for date format to display on UI and in messages.
   */
  public static final SimpleDateFormat DATE_FORMAT 
                         = (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.SHORT);
  
  /**
   * static SimpleDateFormat for time format to display on UI and in messages.
   */
  public static final SimpleDateFormat TIME_FORMAT 
                         = (SimpleDateFormat) DateFormat.getTimeInstance(DateFormat.MEDIUM);
  
  /**
   * static SimpleDateFormat for datetime format to display on UI and in messages.
   */
  public static final SimpleDateFormat DATETIME_FORMAT 
                         = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.SHORT, 
                                                          DateFormat.MEDIUM); 
  /**
   * static SimpleDateFormat for date format to store date as string so that
   * it is stored consistently.
   */
  public static final SimpleDateFormat DATE_STORE_FORMAT
                         = new SimpleDateFormat("MM/dd/yyyy");
  
  /**
   * static SimpleDateFormat for time format to store time as string so that
   * it is stored consistently.
   */
  public static final SimpleDateFormat TIME_STORE_FORMAT 
                         = new SimpleDateFormat("HH:mm:ss");
  
  /**
   * static SimpleDateFormat for datetime format to store date and time as 
   * string so that it is stored consistently.
   */
  public static final SimpleDateFormat DATETIME_STORE_FORMAT 
                         = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
  /**
   * static SimpleDateFormat for date format for sql date
   */
  public static final SimpleDateFormat DATE_SQL_FORMAT
                         = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
  
  /**
   * static SimpleDateFormat for time format for sql time
   */
  public static final SimpleDateFormat TIME_SQL_FORMAT 
                         = new SimpleDateFormat("1970-01-01 HH:mm:ss");
  
  /**
   * static SimpleDateFormat for datetime format for sql date and time
   */
  public static final SimpleDateFormat DATETIME_SQL_FORMAT 
                         = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  // Constructors /////////////////////////////////////////////////////////////
  
  /** 
   * Private constructor since this class cannot be instantiated
   */
  private DateUtils(
  )
  {
     // Do nothing
  }
  
  // Public methods ///////////////////////////////////////////////////////////
  
  /**
   * Check if two dates equals regardless of the time. Two null dates are equal. 
   * Null and not null dates are not equal.
   * 
   * @param  dtFirst - first date to compare, can be null
   * @param  dtSecond - second date to compare, can be null 
   * @return boolean - true if two dates equals regardless of what the time is 
   */
  public static boolean dateEquals(
     Date dtFirst,
     Date dtSecond
  )
  {
     boolean  bReturn = false;
     
     // If they are the same object, they are equals
     bReturn = (dtFirst == dtSecond);
     if (!bReturn)
     {
        if (dtFirst == null)
        {
           // Two null dates are the same
           bReturn = (dtSecond == null);
        }
        else
        {
           if (dtSecond != null)
           {
              Calendar compCalendar;
              int      iEra;
              int      iYear;
              int      iMonth;
              int      iDay;
              
              compCalendar = Calendar.getInstance();
              compCalendar.setTime(dtFirst);
              iEra   = compCalendar.get(Calendar.ERA);
              iYear  = compCalendar.get(Calendar.YEAR);
              iMonth = compCalendar.get(Calendar.MONTH);
              iDay   = compCalendar.get(Calendar.DATE);
              compCalendar.setTime(dtSecond);
        
              bReturn = ((iEra == compCalendar.get(Calendar.ERA))
                        && (iYear == compCalendar.get(Calendar.YEAR))
                        && (iMonth == compCalendar.get(Calendar.MONTH))
                        && (iDay == compCalendar.get(Calendar.DATE)));
           }
        }
     } 
           
     return bReturn;            
  }
  
  /**
   * Check if two times equals regardless of the date. Two null times are equal. 
   * Null and not null times are not equal.
   * 
   * @param  dtFirst - first time to compare, can be null
   * @param  dtSecond - second time to compare, can be null
   * @param  bIgnoreMilliseconds - if true milliseconds will be ignored in comparison
   * @return boolean - true if two time equals regardless of what the date is 
   */
  public static boolean timeEquals(
     Date    dtFirst,
     Date    dtSecond,
     boolean bIgnoreMilliseconds
  )
  {
     boolean  bReturn = false;
     
     // If they are the same object, they are equals
     bReturn = (dtFirst == dtSecond);
     if (!bReturn)
     {
        if (dtFirst == null)
        {
           // Two null dates are the same
           bReturn = (dtSecond == null);
        }
        else
        {
           if (dtSecond != null)
           {
              Calendar compCalendar;
              int      iHour;
              int      iMinute;
              int      iSecond;
              int      iMili;
              
              compCalendar = Calendar.getInstance();
              compCalendar.setTime(dtFirst);
              iHour   = compCalendar.get(Calendar.HOUR_OF_DAY);
              iMinute = compCalendar.get(Calendar.MINUTE);
              iSecond = compCalendar.get(Calendar.SECOND);
              iMili   = compCalendar.get(Calendar.MILLISECOND);
              compCalendar.setTime(dtSecond);
        
              bReturn = ((iHour == compCalendar.get(Calendar.HOUR_OF_DAY))
                        && (iMinute == compCalendar.get(Calendar.MINUTE))
                        && (iSecond == compCalendar.get(Calendar.SECOND))
                        && ((bIgnoreMilliseconds) 
                           || (iMili == compCalendar.get(Calendar.MILLISECOND))));
           }
        }
     } 
           
     return bReturn;            
  }
  /**
   * Check if two dates and times are equal. Two null dates are equal. Null 
   * and not null dates are not equal.
   * 
   * @param  dtFirst - first date time to compare, can be null
   * @param  dtSecond - second date time to compare, can be null
   * @return boolean - true if two date and times are equal 
   */
  public static boolean dateAndTimeEquals(
     Date dtFirst,
     Date dtSecond
  )
  {
     boolean bReturn = false;
     
     // If they are the same object, they are equals
     bReturn = (dtFirst == dtSecond);
     if (!bReturn)
     {
        if (dtFirst == null)
        {
           // Two null dates are the same
           bReturn = (dtSecond == null);
        }
        else
        {
           if (dtSecond != null)
           {
              // They are both not null so they have to match to millisecond
              // (actually to nanosecond since the getTime takes nanoseconds
              // into account)
              bReturn = (dtFirst.getTime() == dtSecond.getTime());                               
           }
        }
     }
           
     return bReturn;            
  }
  /**
   * Check if String representing date is function or date. Date is a function
   * (formula) if it starts with the current date/time variable which can be 
   * followed by expression describing period from current date.
   *
   * @param strValue - string representation of date or date function
   * @return boolean - date function flag
   */
  public static boolean isFunction(
     String   strValue
  )
  {
     boolean bReturn = false;
     if ((strValue != null) && (strValue.length() > 0) 
        && (strValue.trim().startsWith(CURRENT_DATE_CODE)))
     {
        bReturn = true;
     }
     
     return bReturn;
  }
  
  /**
   * Parse date time value from given string resolving any functions or formulas
   * the string can contain. This method  can be therefore used if the passed 
   * string contains string representation date, time or timestamp or a formula
   * such as now + 3h - 1m + 4d. 
   *
   * @param strValue - string representation of date or date function
   * @param iDateType - date type code, one of the DATE_TYPE_XXX constants
   * @param stored - flag if Date should be parsed using format used for 
   *                 storage or for display
   * @return Timestamp - parsed date or null if date was null
   * @throws OSSInvalidDataException - error during parsing
   */
  public static Timestamp parseDateTime(
     String   strValue,
     int      iDateType,
     boolean  stored
  )
  {
     Timestamp tsReturn = null;
     Calendar workCal = GregorianCalendar.getInstance();
     
     if (strValue != null && strValue.length() > 0)
     {
        strValue = strValue.trim();
        if (strValue.startsWith(CURRENT_DATE_CODE))
        {
           strValue = strValue.replaceAll("[ ]", "");
           // If the user specified "UseCurrent", then substitute the
           // current date/time in the value
           workCal.setTime(new Date());

// Log.getInstance().debug("Parsing current date " + strValue);

           // Parse the date math
           int iBeginIndex = CURRENT_DATE_CODE.length();
           int iMaxLength = strValue.length();
           int iSign = 1;
           int iNumberIndex;
           int iValue;
           char cChar = " ";
           while (iBeginIndex < iMaxLength)
           {
              // This has to be sign
              if (strValue.charAt(iBeginIndex) == "+")
              {
                 iSign = 1;
              }
              else if (strValue.charAt(iBeginIndex) == "-")
              {
                 iSign = -1;
              }
              else
              {
                 // Incorrect String
                 throw new RuntimeException(
                          "Date function is in incorrect format: "
                          + strValue + " at " + strValue.substring(iBeginIndex));
              }
              iBeginIndex++;
              // Now we have to have number
              iNumberIndex = iBeginIndex;
              
              while (((iBeginIndex == iNumberIndex) || Character.isDigit(cChar)) 
                    && (iBeginIndex < iMaxLength))
              {
                 cChar = strValue.charAt(iBeginIndex++);
              }
              // We have to go one back because we should stop on modifier (e.g 1m)
              iBeginIndex--;
              try
              {
                 iValue = Integer.parseInt(strValue.substring(iNumberIndex, iBeginIndex));
              }
              catch (NumberFormatException nmeExc)
              {
                 // Incorrect String
                 throw new RuntimeException(
                          "Date function is in incorrect format: "
                          + strValue + " at " + strValue.substring(iNumberIndex));
              }
              // This has to be modifier: y - year, M - month, w - week, 
              // d - day, h - hour, m - minute, s - second
              cChar = strValue.charAt(iBeginIndex);
              switch(cChar)
              {
                 case(YEAR_CODE):
                 {
                    if (iDateType == DATE_TYPE_TIME)
                    {
                       throw new RuntimeException(
                          "Date function is in incorrect format: " +
                          "used YEAR modifier for TIME type");
                    }
                    workCal.add(Calendar.YEAR, iSign * iValue);
                    break;
                 }
                 case(MONTH_CODE):
                 {
                    if (iDateType == DATE_TYPE_TIME)
                    {
                       throw new RuntimeException(
                          "Date function is in incorrect format: " +
                          "used MONTH modifier for TIME type");
                    }
                    workCal.add(Calendar.MONTH, iSign * iValue);
                    break;
                 }
                 case(WEEK_CODE):
                 {
                    if (iDateType == DATE_TYPE_TIME)
                    {
                       throw new RuntimeException(
                          "Date function is in incorrect format: " +
                          "used WEEK modifier for TIME type");
                    }
                    workCal.add(Calendar.WEEK_OF_YEAR, iSign * iValue);
                    break;
                 }
                 case(DAY_CODE):
                 {
                    if (iDateType == DATE_TYPE_TIME)
                    {
                       throw new RuntimeException(
                          "Date function is in incorrect format: " +
                          "used DAY modifier for TIME type");
                    }
                    workCal.add(Calendar.DATE, iSign * iValue);
                    break;
                 }
                 case(HOUR_CODE):
                 {
                    if (iDateType == DATE_TYPE_DATE)
                    {
                       throw new RuntimeException(
                          "Date function is in incorrect format: " +
                          "used HOUR modifier for DATE type");
                    }
                    workCal.add(Calendar.HOUR, iSign * iValue);
                    break;
                 }
                 case(MINUTE_CODE):
                 {
                    if (iDateType == DATE_TYPE_DATE)
                    {
                       throw new RuntimeException(
                          "Date function is in incorrect format: " +
                          "used MINUTE modifier for DATE type");
                    }
                    workCal.add(Calendar.MINUTE, iSign * iValue);
                    break;
                 }
                 case(SECOND_CODE):
                 {
                    if (iDateType == DATE_TYPE_DATE)
                    {
                       throw new RuntimeException(
                          "Date function is in incorrect format: " +
                          "used SECOND modifier for DATE type");
                    }
                    workCal.add(Calendar.SECOND, iSign * iValue);
                    break;
                 }
                 default:
                 {
                    // Incorrect String
                    throw new RuntimeException(
                          "Date function is in incorrect format: "
                          + strValue + " at " + strValue.substring(iBeginIndex));
                 }
              }
              iBeginIndex++;
           }
           
           tsReturn = new Timestamp(workCal.getTimeInMillis());
           
        }
        else
        {
           try
           {
              if (stored)
              {
                 switch (iDateType)
                 {
                    case (DATE_TYPE_DATE) :
                    {
                       tsReturn = new Timestamp(DATE_STORE_FORMAT.parse(strValue).getTime());
                       break;   
                    }
                    case (DATE_TYPE_TIME) :
                    {
                       tsReturn = new Timestamp(TIME_STORE_FORMAT.parse(strValue).getTime());
                       break;   
                    }
                    case (DATE_TYPE_DATETIME) :
                    {
                       tsReturn = new Timestamp(DATETIME_STORE_FORMAT.parse(strValue).getTime());
                       break;   
                    }
                    default:
                    {
                       assert false : "Unknown date type " + iDateType;
                    }
                 }                  
              }
              else
              {
                 switch (iDateType)
                 {
                    case (DATE_TYPE_DATE) :
                    {
                       tsReturn = new Timestamp(DATE_FORMAT.parse(strValue).getTime());
                       break;   
                    }
                    case (DATE_TYPE_TIME) :
                    {
                       tsReturn = new Timestamp(TIME_FORMAT.parse(strValue).getTime());
                       break;   
                    }
                    case (DATE_TYPE_DATETIME) :
                    {
                       tsReturn = new Timestamp(DATETIME_FORMAT.parse(strValue).getTime());
                       break;   
                    }
                    default:
                    {
                       assert false : "Unknown date type " + iDateType;
                    }                  
                 }                  
              }
           }
           catch (ParseException peExc)
           {
              throw new RuntimeException(
                    "Date is in incorrect format. Problems with parsing.",
                    peExc);
           }
        }
     }
     return tsReturn;
  }
  
  /**
   * Parse the specified period into string displaying number of days the 
   * period represents. 
   * 
   * @param lPeriod - period in miliseconds
   * @return String - period in format "x day(s)" or "" if not valid period
   */
  public static String parseDayPeriod(
     long lPeriod
  )
  {
     StringBuffer sbReturn = new StringBuffer();
     long lDays = 0L;
     
     if (lPeriod > 0)
     {
        // we will count each started day as counted day 
        lPeriod = lPeriod + DateUtils.ONE_DAY - 1;
        
        lDays = lPeriod / DateUtils.ONE_DAY;
        sbReturn.append(lDays);
        if (lDays == 1L)
        {
           sbReturn.append(" day");
        }
        else
        {
           sbReturn.append(" days");
        }
     }
     else
     {
        sbReturn.append("0 days");
     }
     return sbReturn.toString();
  }
  
  /**
   * Parse the specified period into string displaying date and time the 
   * period represents. 
   * 
   * @param lPeriod - preiod in miliseconds
   * @return String - period in format "x day(s) y hour(s) z minute(s)" 
   *                  or "" if not valid period
   */
  public static String parseDayTimePeriod(
     long lPeriod
  )
  {
     StringBuffer sbReturn = new StringBuffer();
     long lHelp = 0L;
     
     
     if (lPeriod > 0)
     {
        lPeriod = lPeriod + DateUtils.ONE_MINUTE - 1;
        // we will count each started day as counted day 
        lHelp = lPeriod / DateUtils.ONE_DAY;
        if (lHelp > 0)
        {
           sbReturn.append(lHelp);
           if (lHelp == 1L)
           {
              sbReturn.append(" d ");
           }
           else
           {
              sbReturn.append(" d ");
           }
        }
        lPeriod = lPeriod % DateUtils.ONE_DAY;
        lHelp = lPeriod / DateUtils.ONE_HOUR;
        if (lHelp > 0 || sbReturn.length() > 0)
        {
           sbReturn.append(lHelp);
           if (lHelp == 1L)
           {
              sbReturn.append(" h ");
           }
           else
           {
              sbReturn.append(" h ");
           }
        }
        lPeriod = lPeriod % DateUtils.ONE_HOUR;
        lHelp = lPeriod / DateUtils.ONE_MINUTE;
        if (lHelp > 0 || sbReturn.length() > 0)
        {
           sbReturn.append(lHelp);
           if (lHelp == 1L)
           {
              sbReturn.append(" min");
           }
           else
           {
              sbReturn.append(" min");
           }
        }
     }
     else
     {
        sbReturn.append("0 min");
     }
     return sbReturn.toString();
  }
  

// TODO: For Miro: Remove this code once all the code which referred to these // was fixed. These should be moved to a GUI related class. // /** // * Method for list of timing types. // * // * @return List - list of timing types // */ // public static List getTimingTypes( // ) // { // List lstTimingTypes = new ArrayList(); // // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_MINUTES), // "Minute(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_HOURS), "Hour(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_DAYS), "Day(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_WEEKS), "Week(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_MONTHS), "Month(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_YEARS), "Year(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_NEVER), "Never")); // // return lstTimingTypes; // } // /** // * Method for list of timing types with None option. // * // * @return List - list of timing types // */ // public static List getTimingTypesWithNone( // ) // { // List lstTimingTypes = new ArrayList(); // // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_NONE), "None")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_MINUTES), // "Minute(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_HOURS), "Hour(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_DAYS), "Day(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_WEEKS), "Week(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_MONTHS), "Month(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_YEARS), "Year(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_NEVER), "Never")); // // return lstTimingTypes; // } // /** // * Method for getting string name of the timing type. // * // * @param iTimingType - timing type constant // * @return String - string name of timing type // */ // public static String getTimingTypeName( // int iTimingType // ) // { // String outTimingTypeName = "Never"; // switch (iTimingType) // { // case (DateUtils.TIMING_NEVER): // { // outTimingTypeName = "Never"; // break; // } // case (DateUtils.TIMING_MINUTES): // { // outTimingTypeName = "Minute(s)"; // break; // } // case (DateUtils.TIMING_HOURS): // { // outTimingTypeName = "Hour(s)"; // break; // } // case (DateUtils.TIMING_DAYS): // { // outTimingTypeName = "Day(s)"; // break; // } // case (DateUtils.TIMING_WEEKS): // { // outTimingTypeName = "Week(s)"; // break; // } // case (DateUtils.TIMING_MONTHS): // { // outTimingTypeName = "Month(s)"; // break; // } // case (DateUtils.TIMING_YEARS): // { // outTimingTypeName = "Year(s)"; // break; // } // case (DateUtils.TIMING_NONE): // { // outTimingTypeName = "None"; // break; // } // } // // return outTimingTypeName; // }

  /**
   * Get expiration timestamp from start date, period type and duration. For 
   * example if the start date is now, period type is hour and duration is 2
   * then the result will be timestamp representing now + 2 hours.  
   * 
   * @param tsStartDate - start date of period counting
   * @param iPeriodType - one of the period type constant TIMING_XXX 
   * @param iPeriodDuration - period duration, number of time units specified 
   *                          by period type
   * @return Timestamp - date of period expiration or null if any problem
   */
  public static Timestamp getPeriodExpiration(
     Timestamp tsStartDate,
     int       iPeriodType,
     int       iPeriodDuration
  )
  {
     Timestamp tsReturn = null;
     Calendar calHelp;
     if (tsStartDate != null && iPeriodDuration > 0 
           && iPeriodType > TIMING_NEVER && iPeriodType < TIMING_NONE)
     {
        calHelp = Calendar.getInstance();
        calHelp.setTime(tsStartDate);
        
        switch (iPeriodType)
        {
           case (TIMING_MINUTES) :
           {
              calHelp.add(Calendar.MINUTE, iPeriodDuration);
              break;
           }
           case (TIMING_HOURS) :
           {
              calHelp.add(Calendar.HOUR, iPeriodDuration);
              break;
           }
           case (TIMING_DAYS) :
           {
              calHelp.add(Calendar.DATE, iPeriodDuration);
              break;
           }
           case (TIMING_WEEKS) :
           {
              calHelp.add(Calendar.WEEK_OF_YEAR, iPeriodDuration);
              break;
           }
           case (TIMING_MONTHS) :
           {
              calHelp.add(Calendar.MONTH, iPeriodDuration);
              break;
           }
           case (TIMING_YEARS) :
           {
              calHelp.add(Calendar.YEAR, iPeriodDuration);
              break;
           }
           default :
           {
              assert false : "Not supported Timing type " + iPeriodType;
           } 
        }
        tsReturn = new Timestamp(calHelp.getTimeInMillis());
     }
     
     return tsReturn;
  }
  
  /**
   * Method to compare time periods
   * 
   * @param iPeriodType1 - first period type, one of the period type constant 
   *                       TIMING_XXX
   * @param iPeriodDuration1 - first period duration
   * @param iPeriodType2 - second period type, one of the period type constant 
   *                       TIMING_XXX
   * @param iPeriodDuration2 - second period duration
   * @return int - 1 - first period is longer
   *               0 - periods are same
   *              -1 - first period is shorter
   */
  public static int comparePeriods(
     int iPeriodType1,
     int iPeriodDuration1,
     int iPeriodType2,
     int iPeriodDuration2
  )
  {
     int iReturn = 0;
     
     if ((iPeriodType1 != TIMING_NEVER) && (iPeriodType1 != TIMING_NONE) 
        && (iPeriodType2 != TIMING_NEVER) && (iPeriodType2 != TIMING_NONE))
     {
        Timestamp tsTimestamp1 = getPeriodExpiration(
              new Timestamp(0), iPeriodType1, iPeriodDuration1);
        Timestamp tsTimestamp2 = getPeriodExpiration(
              new Timestamp(0), iPeriodType2, iPeriodDuration2);
        
        // TODO: Improve: When would any of these be null?
        if ((tsTimestamp1 != null) && (tsTimestamp2 != null))
        {
           if (tsTimestamp1.after(tsTimestamp2))
           {
              iReturn = 1;
           }
           else if (tsTimestamp2.after(tsTimestamp1))
           {
              iReturn = -1;
           }
        }
     }
     else
     {
        if (iPeriodType1 != iPeriodType2)
        {
           if (iPeriodType1 == TIMING_NEVER)
           {
              iReturn = 1;
           }
           else if (iPeriodType1 == TIMING_NONE)
           {
              iReturn = -1;
           }
           else if (iPeriodType2 == TIMING_NEVER)
           {
              iReturn = -1;
           }
           else if (iPeriodType2 == TIMING_NONE)
           {
              iReturn = 1;
           }
        }
     }
     return iReturn;      
  }
  
  /**
   * Convert timestamp to string including it"s nanosecond portion so that it 
   * can be safely stored in variable of web page.
   * 
   * @param tsTimestamp - timestamp to convert
   * @return String - text containing time and nanosecond portion of timestamp
   */
  public static String getTimestampAsString(
     Timestamp tsTimestamp
  )
  {
     StringBuffer sbTimestamp = new StringBuffer();
     
     sbTimestamp.append(tsTimestamp.getTime());
     sbTimestamp.append(NANO_SEPARATOR);
     sbTimestamp.append(tsTimestamp.getNanos());
     
     return sbTimestamp.toString();
  }
  
  /**
   * Function returns time string in the form MM:SS.MS from the input specified in miliseconds. 
   * 
   * @param lTimeInMiliseconds - time in miliseconds
   * @return String - string representation of miliseconds in the form MM:SS.MS
   */
  public static String getStringTime(
     long lTimeInMiliseconds
  )
  {
     long lTotalMS   = lTimeInMiliseconds;
     long lMS        = lTotalMS % 1000;
     long lTotalSecs = lTotalMS / 1000;
     long lSecs      = lTotalSecs % 60;
     long lTotalMins = lTotalSecs / 60;
     long lMinutes   = lTotalMins % 60;
     long lHours     = lTotalMins / 60;
     StringBuffer sbBuffer = new StringBuffer();
     if (lHours > 0)
     {
        sbBuffer.append(lHours);
        sbBuffer.append(":");
        sbBuffer.append(lMinutes);
        sbBuffer.append(":");
        sbBuffer.append(lSecs);
        sbBuffer.append(".");
        sbBuffer.append(lMS);
     }
     else if (lMinutes > 0)
     {
        sbBuffer.append(lMinutes);
        sbBuffer.append(":");
        sbBuffer.append(lSecs);
        sbBuffer.append(".");
        sbBuffer.append(lMS);
     }
     else if (lSecs > 0)
     {
        sbBuffer.append(lSecs);
        sbBuffer.append(".");
        sbBuffer.append(lMS);
        sbBuffer.append(" seconds");
     }
     else
     {
        sbBuffer.append(lMS);
        sbBuffer.append(" ms");
     }
     
     return sbBuffer.toString();
  }

// TODO: For Miro: Remove this code once all the code which referred to these // was fixed. These should be moved to a GUI or business logic related class. // /** // * Method to check if valid period settings // * // * @param iPeriod - period length // * @param iPeriodType - period type // * @param iPeriodStartType - period start type // * @param iAttributeId - attribute ID for dynamic period start type // * @param bPeriodException - period exception flag // * @param strPeriodName - period name used for exception message // * @param bAdvancePeriodType - flag if advanced period type (includes also start type) // * @param bfideException - invalid data exception // */ // public static void validatePeriod( // int iPeriod, // int iPeriodType, // int iPeriodStartType, // int iAttributeId, // boolean bPeriodException, // String strPeriodName, // boolean bAdvancePeriodType, // OSSInvalidDataException messageException // ) // { // if ((iPeriod > 0) // || ((iPeriodType != TIMING_NONE) && (iPeriodType != TIMING_NEVER)) // || (bPeriodException) || (iPeriodStartType != PERIOD_START_TYPE_NONE)) // { // if (iPeriod <= 0) // { // if (messageException == null) // { // messageException = new OSSInvalidDataException(); // } // messageException.getErrorMessages().addMessage( // PERIOD_TYPE_OBJ, // "You have to set valid period length for " + strPeriodName + " type." // ); // } // else if ((iPeriodType == TIMING_NONE) || (iPeriodType == TIMING_NEVER)) // { // if (messageException == null) // { // messageException = new OSSInvalidDataException(); // } // messageException.getErrorMessages().addMessage( // PERIOD_TYPE_OBJ, // "You have to set valid period type for " + strPeriodName + " type." // ); // } // else if ((bAdvancePeriodType) && (iPeriodStartType == PERIOD_START_TYPE_NONE)) // { // if (messageException == null) // { // messageException = new OSSInvalidDataException(); // } // messageException.getErrorMessages().addMessage( // PERIOD_TYPE_OBJ, // "You have to set valid period start type for " + strPeriodName + " type." // ); // } // else if ((bAdvancePeriodType) // && (iPeriodStartType == PERIOD_START_TYPE_DYNAMIC) // && (iAttributeId == DataObject.NEW_ID)) // { // if (messageException == null) // { // messageException = new OSSInvalidDataException(); // } // messageException.getErrorMessages().addMessage( // PERIOD_TYPE_OBJ, // "You have to set valid period dynamic start attribute for " // + strPeriodName + " type." // ); // } // } // } }


 </source>
   
  
 
  



Construct java.sql.Timestamp from string

   <source lang="java">
 

public class DateLabel {

 public static void main(String[] args) {
   java.util.Date today = new java.util.Date();
   java.sql.Timestamp ts1 = new java.sql.Timestamp(today.getTime());
   java.sql.Timestamp ts2 = java.sql.Timestamp.valueOf("2005-04-06 09:01:10");
   long tsTime1 = ts1.getTime();
   long tsTime2 = ts2.getTime();
   
   System.out.println(tsTime1);
   System.out.println(tsTime2);
 }

}


 </source>
   
  
 
  



Convert an Object to a DateTime, without an Exception

   <source lang="java">
 

/*

* Copyright Javelin Software, All rights reserved.
*/

import java.util.*; import java.text.*; /**

* The DateUtil is used as a Utility Class for Dates.
* 
* @author Robin Sharp
*/

public class DateUtil {

   public final static long SECOND_MILLIS = 1000;
   public final static long MINUTE_MILLIS = SECOND_MILLIS*60;
   public final static long HOUR_MILLIS = MINUTE_MILLIS*60;
   public final static long DAY_MILLIS = HOUR_MILLIS*24;
   public final static long YEAR_MILLIS = DAY_MILLIS*365;
   public static DateFormat OUT_DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy");
   public static DateFormat OUT_TIME_FORMAT = new SimpleDateFormat("H:mm:ss");
   public static DateFormat OUT_DATETIME_FORMAT = new SimpleDateFormat("d/M/yyyy H:mm:ss");
   public static DateFormat OUT_TIMESTAMP_FORMAT = new SimpleDateFormat("d/M/yy H:mm:ss.SSS");
   
   public static DateFormat IN_DATE_FORMAT = new SimpleDateFormat("d/M/yy");
   public static DateFormat IN_TIME_FORMAT = new SimpleDateFormat("H:mm:ss");
   public static DateFormat IN_DATETIME_FORMAT = new SimpleDateFormat("d/M/yy H:mm:ss");
   public static DateFormat IN_TIMESTAMP_FORMAT = new SimpleDateFormat("d/M/yy H:mm:ss.SSS");
   
   public static DateFormat DATE_TIME_FORMAT= new SimpleDateFormat( "yyyyMMddkkmmss" );  
   public static Calendar calendar = new GregorianCalendar();
   static
   {
       IN_DATE_FORMAT.setLenient(false);
       IN_TIME_FORMAT.setLenient(false);
       IN_DATETIME_FORMAT.setLenient(false);
   }
   /**
    * Create a new DateTime. To the last second. This will not create any 
    * extra-millis-seconds, which may cause bugs when writing to stores such as
    * databases that round milli-seconds up and down. 
    */
   public static java.util.Date newDateTime()
   {
       return new java.util.Date( (System.currentTimeMillis()/SECOND_MILLIS)*SECOND_MILLIS);
   }
   /**
    * Create a new Date. To the last day.
    */
   public static java.sql.Date newDate()
   {
       return new java.sql.Date( (System.currentTimeMillis()/DAY_MILLIS)*DAY_MILLIS);
   }
   
   /**
    * Create a new Time, with no date component. 
    */
   public static java.sql.Time newTime()
   {
       return new java.sql.Time( System.currentTimeMillis()%DAY_MILLIS);
   }
   
   /**
    * Create a new Timestamp. 
    */
   public static java.sql.Timestamp newTimestamp()
   {
       return new java.sql.Timestamp( System.currentTimeMillis() );
   }
   
   /**
    * Get the seconds difference
    */
   public static int secondsDiff( Date earlierDate, Date laterDate )
   {
       if( earlierDate == null || laterDate == null ) return 0;
       
       return (int)((laterDate.getTime()/SECOND_MILLIS) - (earlierDate.getTime()/SECOND_MILLIS));
   }
   /**
    * Get the minutes difference
    */
   public static int minutesDiff( Date earlierDate, Date laterDate )
   {
       if( earlierDate == null || laterDate == null ) return 0;
       
       return (int)((laterDate.getTime()/MINUTE_MILLIS) - (earlierDate.getTime()/MINUTE_MILLIS));
   }
   
   /**
    * Get the hours difference
    */
   public static int hoursDiff( Date earlierDate, Date laterDate )
   {
       if( earlierDate == null || laterDate == null ) return 0;
       
       return (int)((laterDate.getTime()/HOUR_MILLIS) - (earlierDate.getTime()/HOUR_MILLIS));
   }
   
   /**
    * Get the days difference
    */
   public static int daysDiff( Date earlierDate, Date laterDate )
   {
       if( earlierDate == null || laterDate == null ) return 0;
       
       return (int)((laterDate.getTime()/DAY_MILLIS) - (earlierDate.getTime()/DAY_MILLIS));
   }
   
  /**
   * Roll the java.util.Time forward or backward.
   * @param startDate - The start date
   * @period Calendar.YEAR etc
   * @param amount - Negative to rollbackwards.
   */
   public static java.sql.Time rollTime( java.util.Date startDate, int period, int amount )
   {
       GregorianCalendar gc = new GregorianCalendar();
       gc.setTime(startDate);
       gc.add(period, amount);
       return new java.sql.Time(gc.getTime().getTime());
   }
   
  /**
   * Roll the java.util.Date forward or backward.
   * @param startDate - The start date
   * @period Calendar.YEAR etc
   * @param amount - Negative to rollbackwards.
   */
   public static java.util.Date rollDateTime( java.util.Date startDate, int period, int amount )
   {
       GregorianCalendar gc = new GregorianCalendar();
       gc.setTime(startDate);
       gc.add(period, amount);
       return new java.util.Date(gc.getTime().getTime());
   }
   
  /**
   * Roll the java.sql.Date forward or backward.
   * @param startDate - The start date
   * @period Calendar.YEAR etc
   * @param amount - Negative to rollbackwards.
   */
   public static java.sql.Date rollDate( java.util.Date startDate, int period, int amount )
   {
       GregorianCalendar gc = new GregorianCalendar();
       gc.setTime(startDate);
       gc.add(period, amount);
       return new java.sql.Date(gc.getTime().getTime());
   }
   
  /**
   * Roll the years forward or backward.
   * @param startDate - The start date
   * @param years - Negative to rollbackwards.
   */
   public static java.sql.Date rollYears( java.util.Date startDate, int years )
   {
       return rollDate( startDate, Calendar.YEAR, years );
   }
  /**
   * Roll the days forward or backward.
   * @param startDate - The start date
   * @param months - Negative to rollbackwards.
   */
   public static java.sql.Date rollMonths( java.util.Date startDate, int months )
   {
       return rollDate( startDate, Calendar.MONTH, months );
   }
  /**
   * Roll the days forward or backward.
   * @param startDate - The start date
   * @param days - Negative to rollbackwards.
   */
   public static java.sql.Date rollDays( java.util.Date startDate, int days )
   {
       return rollDate( startDate, Calendar.DATE, days );
   }
   
    /**
     * Checks the day, month and year are equal.
     */
    public static boolean dateEquals( java.util.Date d1, java.util.Date d2 )
    {
       if( d1 == null || d2 == null ) return false;
       
       return d1.getDate() == d2.getDate() &&
              d1.getMonth() == d2.getMonth() &&
              d1.getYear() == d2.getYear();
    }
    
    /**
     * Checks the hour, minute and second are equal.
     */
    public static boolean timeEquals( java.util.Date d1, java.util.Date d2 )
    {
       if( d1 == null || d2 == null ) return false;
       
       return d1.getHours() == d2.getHours() &&
              d1.getMinutes() == d2.getMinutes() &&
              d1.getSeconds() == d2.getSeconds();
    }
   /**
     * Checks the second, hour, month, day, month and year are equal.
     */
    public static boolean dateTimeEquals( java.util.Date d1, java.util.Date d2 )
    {
       if( d1 == null || d2 == null ) return false;               
       
       return d1.getDate() == d2.getDate() &&
              d1.getMonth() == d2.getMonth() &&
              d1.getYear() == d2.getYear() &&
              d1.getHours() == d2.getHours() &&
              d1.getMinutes() == d2.getMinutes() &&
              d1.getSeconds() == d2.getSeconds();
    }
    
    /**
    * Convert an Object of type Classs to an Object.
    */
   public static Object toObject( Class clazz, Object value ) throws ParseException
   {
       if( value == null ) return null;
       if( clazz == null ) return value;
       
       if( java.sql.Date.class.isAssignableFrom( clazz ) ) return toDate( value );
       if( java.sql.Time.class.isAssignableFrom( clazz ) ) return toTime( value );
       if( java.sql.Timestamp.class.isAssignableFrom( clazz ) ) return toTimestamp( value );
       if( java.util.Date.class.isAssignableFrom( clazz ) ) return toDateTime( value );
       
       return value;
   }
   
   /**
    * Convert an Object to a DateTime, without an Exception
    */
   public static java.util.Date getDateTime( Object value )
   {
       try
       {
           return toDateTime( value );
       }
       catch( ParseException pe )
       {
           pe.printStackTrace();
           return null;
       }
   }
   
   /**
    * Convert an Object to a DateTime.
    */
   public static java.util.Date toDateTime( Object value ) throws ParseException
   {
       if( value == null ) return null;        
       if( value instanceof java.util.Date ) return (java.util.Date)value;
       if( value instanceof String )
       {
           if( "".equals( (String)value ) ) return null;
           return IN_DATETIME_FORMAT.parse( (String)value );
       }
               
       return IN_DATETIME_FORMAT.parse( value.toString() );
   }
   
   /**
    * Convert an Object to a Date, without an Exception
    */
   public static java.sql.Date getDate( Object value )
   {
       try
       {
           return toDate( value );
       }
       catch( ParseException pe )
       {
           pe.printStackTrace();
           return null;
       }
   }
   /**
    * Convert an Object to a Date.
    */
   public static java.sql.Date toDate( Object value ) throws ParseException
   {
       if( value == null ) return null;        
       if( value instanceof java.sql.Date ) return (java.sql.Date)value;
       if( value instanceof String )
       {
           if( "".equals( (String)value ) ) return null;
           return new java.sql.Date( IN_DATE_FORMAT.parse( (String)value ).getTime() );
       }
               
       return new java.sql.Date( IN_DATE_FORMAT.parse( value.toString() ).getTime() );
   }
   
   /**
    * Convert an Object to a Time, without an Exception
    */
   public static java.sql.Time getTime( Object value )
   {
       try
       {
           return toTime( value );
       }
       catch( ParseException pe )
       {
           pe.printStackTrace();
           return null;
       }
   }
   
   /**
    * Convert an Object to a Time.
    */
   public static java.sql.Time toTime( Object value ) throws ParseException
   {
       if( value == null ) return null;        
       if( value instanceof java.sql.Time ) return (java.sql.Time)value;
       if( value instanceof String )
       {
           if( "".equals( (String)value ) ) return null;
           return new java.sql.Time( IN_TIME_FORMAT.parse( (String)value ).getTime() );
       }
               
       return new java.sql.Time( IN_TIME_FORMAT.parse( value.toString() ).getTime() );
   }
   
   /**
    * Convert an Object to a Timestamp, without an Exception
    */
   public static java.sql.Timestamp getTimestamp( Object value )
   {
       try
       {
           return toTimestamp( value );
       }
       catch( ParseException pe )
       {
           pe.printStackTrace();
           return null;
       }
   }
   /**
    * Convert an Object to a Timestamp.
    */
   public static java.sql.Timestamp toTimestamp( Object value ) throws ParseException
   {
       if( value == null ) return null;        
       if( value instanceof java.sql.Timestamp ) return (java.sql.Timestamp)value;
       if( value instanceof String )
       {
           if( "".equals( (String)value ) ) return null;
           return new java.sql.Timestamp( IN_TIMESTAMP_FORMAT.parse( (String)value ).getTime() );
       }
               
       return new java.sql.Timestamp( IN_TIMESTAMP_FORMAT.parse( value.toString() ).getTime() );
   }
   
   /**
    * Tells you if the date part of a datetime is in a certain time range.
    */
   public static boolean isTimeInRange( java.sql.Time start, java.sql.Time end, java.util.Date d )
   {
       d=new java.sql.Time(d.getHours(),d.getMinutes(),d.getSeconds());
       
       if (start==null || end==null)
       {
           return false;
       }
       
       if (start.before(end)&&(!(d.after(start)&&d.before(end))))
       {
           return false;
       }
       
       if (end.before(start)&&(!(d.after(end)||d.before(start))))
       {
           return false;
       }   
       return true;
   }
   public static  int getYear( Date date )
   {
       calendar.setTime( date );
       return calendar.get( Calendar.YEAR );
   }
   public static int getMonth( Date date )
   {
       calendar.setTime( date );
       return calendar.get( Calendar.MONTH );
   }
   public static int getDate( Date date )
   {
       calendar.setTime( date );
       return calendar.get( Calendar.DATE );
   }
   public static int getHour( Date date )
   {
       calendar.setTime( date );
       return calendar.get( Calendar.HOUR );
   }
   public static int getMinute( Date date )
   {
       calendar.setTime( date );
       return calendar.get( Calendar.MINUTE );
   }
   public static int getSeconds( Date date )
   {
       calendar.setTime( date );
       return calendar.get( Calendar.SECOND );
   }
   public static int getMillisecond( Date date )
   {
       calendar.setTime( date );
       return calendar.get( Calendar.MILLISECOND );
   }
   
   /**
    * Convert an Object to a String using Dates
    */
   public static String toString( Object date )
   {
       if( date == null ) return null;
       
       if( java.sql.Timestamp.class.isAssignableFrom( date.getClass() ) )
       {
           return OUT_TIMESTAMP_FORMAT.format( date );
       }
       if( java.sql.Time.class.isAssignableFrom( date.getClass() ) )
       {
           return OUT_TIME_FORMAT.format( date );
       }
       if( java.sql.Date.class.isAssignableFrom( date.getClass() ) )
       {
           return OUT_DATE_FORMAT.format( date );
       }
       if( java.util.Date.class.isAssignableFrom( date.getClass() ) )
       {
           return OUT_DATETIME_FORMAT.format( date );
       }
       
       throw new IllegalArgumentException( "Unsupported type " + date.getClass() );
   }

}


 </source>
   
  
 
  



Convert an Object to a java.sql.Time

   <source lang="java">
 

/*

* Copyright Javelin Software, All rights reserved.
*/

import java.util.*; import java.text.*; /**

* The DateUtil is used as a Utility Class for Dates.
* 
* @author Robin Sharp
*/

public class DateUtil {

   public final static long SECOND_MILLIS = 1000;
   public final static long MINUTE_MILLIS = SECOND_MILLIS*60;
   public final static long HOUR_MILLIS = MINUTE_MILLIS*60;
   public final static long DAY_MILLIS = HOUR_MILLIS*24;
   public final static long YEAR_MILLIS = DAY_MILLIS*365;
   public static DateFormat OUT_DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy");
   public static DateFormat OUT_TIME_FORMAT = new SimpleDateFormat("H:mm:ss");
   public static DateFormat OUT_DATETIME_FORMAT = new SimpleDateFormat("d/M/yyyy H:mm:ss");
   public static DateFormat OUT_TIMESTAMP_FORMAT = new SimpleDateFormat("d/M/yy H:mm:ss.SSS");
   
   public static DateFormat IN_DATE_FORMAT = new SimpleDateFormat("d/M/yy");
   public static DateFormat IN_TIME_FORMAT = new SimpleDateFormat("H:mm:ss");
   public static DateFormat IN_DATETIME_FORMAT = new SimpleDateFormat("d/M/yy H:mm:ss");
   public static DateFormat IN_TIMESTAMP_FORMAT = new SimpleDateFormat("d/M/yy H:mm:ss.SSS");
   
   public static DateFormat DATE_TIME_FORMAT= new SimpleDateFormat( "yyyyMMddkkmmss" );  
   public static Calendar calendar = new GregorianCalendar();
   static
   {
       IN_DATE_FORMAT.setLenient(false);
       IN_TIME_FORMAT.setLenient(false);
       IN_DATETIME_FORMAT.setLenient(false);
   }
   /**
    * Create a new DateTime. To the last second. This will not create any 
    * extra-millis-seconds, which may cause bugs when writing to stores such as
    * databases that round milli-seconds up and down. 
    */
   public static java.util.Date newDateTime()
   {
       return new java.util.Date( (System.currentTimeMillis()/SECOND_MILLIS)*SECOND_MILLIS);
   }
   /**
    * Create a new Date. To the last day.
    */
   public static java.sql.Date newDate()
   {
       return new java.sql.Date( (System.currentTimeMillis()/DAY_MILLIS)*DAY_MILLIS);
   }
   
   /**
    * Create a new Time, with no date component. 
    */
   public static java.sql.Time newTime()
   {
       return new java.sql.Time( System.currentTimeMillis()%DAY_MILLIS);
   }
   
   /**
    * Create a new Timestamp. 
    */
   public static java.sql.Timestamp newTimestamp()
   {
       return new java.sql.Timestamp( System.currentTimeMillis() );
   }
   
   /**
    * Get the seconds difference
    */
   public static int secondsDiff( Date earlierDate, Date laterDate )
   {
       if( earlierDate == null || laterDate == null ) return 0;
       
       return (int)((laterDate.getTime()/SECOND_MILLIS) - (earlierDate.getTime()/SECOND_MILLIS));
   }
   /**
    * Get the minutes difference
    */
   public static int minutesDiff( Date earlierDate, Date laterDate )
   {
       if( earlierDate == null || laterDate == null ) return 0;
       
       return (int)((laterDate.getTime()/MINUTE_MILLIS) - (earlierDate.getTime()/MINUTE_MILLIS));
   }
   
   /**
    * Get the hours difference
    */
   public static int hoursDiff( Date earlierDate, Date laterDate )
   {
       if( earlierDate == null || laterDate == null ) return 0;
       
       return (int)((laterDate.getTime()/HOUR_MILLIS) - (earlierDate.getTime()/HOUR_MILLIS));
   }
   
   /**
    * Get the days difference
    */
   public static int daysDiff( Date earlierDate, Date laterDate )
   {
       if( earlierDate == null || laterDate == null ) return 0;
       
       return (int)((laterDate.getTime()/DAY_MILLIS) - (earlierDate.getTime()/DAY_MILLIS));
   }
   
  /**
   * Roll the java.util.Time forward or backward.
   * @param startDate - The start date
   * @period Calendar.YEAR etc
   * @param amount - Negative to rollbackwards.
   */
   public static java.sql.Time rollTime( java.util.Date startDate, int period, int amount )
   {
       GregorianCalendar gc = new GregorianCalendar();
       gc.setTime(startDate);
       gc.add(period, amount);
       return new java.sql.Time(gc.getTime().getTime());
   }
   
  /**
   * Roll the java.util.Date forward or backward.
   * @param startDate - The start date
   * @period Calendar.YEAR etc
   * @param amount - Negative to rollbackwards.
   */
   public static java.util.Date rollDateTime( java.util.Date startDate, int period, int amount )
   {
       GregorianCalendar gc = new GregorianCalendar();
       gc.setTime(startDate);
       gc.add(period, amount);
       return new java.util.Date(gc.getTime().getTime());
   }
   
  /**
   * Roll the java.sql.Date forward or backward.
   * @param startDate - The start date
   * @period Calendar.YEAR etc
   * @param amount - Negative to rollbackwards.
   */
   public static java.sql.Date rollDate( java.util.Date startDate, int period, int amount )
   {
       GregorianCalendar gc = new GregorianCalendar();
       gc.setTime(startDate);
       gc.add(period, amount);
       return new java.sql.Date(gc.getTime().getTime());
   }
   
  /**
   * Roll the years forward or backward.
   * @param startDate - The start date
   * @param years - Negative to rollbackwards.
   */
   public static java.sql.Date rollYears( java.util.Date startDate, int years )
   {
       return rollDate( startDate, Calendar.YEAR, years );
   }
  /**
   * Roll the days forward or backward.
   * @param startDate - The start date
   * @param months - Negative to rollbackwards.
   */
   public static java.sql.Date rollMonths( java.util.Date startDate, int months )
   {
       return rollDate( startDate, Calendar.MONTH, months );
   }
  /**
   * Roll the days forward or backward.
   * @param startDate - The start date
   * @param days - Negative to rollbackwards.
   */
   public static java.sql.Date rollDays( java.util.Date startDate, int days )
   {
       return rollDate( startDate, Calendar.DATE, days );
   }
   
    /**
     * Checks the day, month and year are equal.
     */
    public static boolean dateEquals( java.util.Date d1, java.util.Date d2 )
    {
       if( d1 == null || d2 == null ) return false;
       
       return d1.getDate() == d2.getDate() &&
              d1.getMonth() == d2.getMonth() &&
              d1.getYear() == d2.getYear();
    }
    
    /**
     * Checks the hour, minute and second are equal.
     */
    public static boolean timeEquals( java.util.Date d1, java.util.Date d2 )
    {
       if( d1 == null || d2 == null ) return false;
       
       return d1.getHours() == d2.getHours() &&
              d1.getMinutes() == d2.getMinutes() &&
              d1.getSeconds() == d2.getSeconds();
    }
   /**
     * Checks the second, hour, month, day, month and year are equal.
     */
    public static boolean dateTimeEquals( java.util.Date d1, java.util.Date d2 )
    {
       if( d1 == null || d2 == null ) return false;               
       
       return d1.getDate() == d2.getDate() &&
              d1.getMonth() == d2.getMonth() &&
              d1.getYear() == d2.getYear() &&
              d1.getHours() == d2.getHours() &&
              d1.getMinutes() == d2.getMinutes() &&
              d1.getSeconds() == d2.getSeconds();
    }
    
    /**
    * Convert an Object of type Classs to an Object.
    */
   public static Object toObject( Class clazz, Object value ) throws ParseException
   {
       if( value == null ) return null;
       if( clazz == null ) return value;
       
       if( java.sql.Date.class.isAssignableFrom( clazz ) ) return toDate( value );
       if( java.sql.Time.class.isAssignableFrom( clazz ) ) return toTime( value );
       if( java.sql.Timestamp.class.isAssignableFrom( clazz ) ) return toTimestamp( value );
       if( java.util.Date.class.isAssignableFrom( clazz ) ) return toDateTime( value );
       
       return value;
   }
   
   /**
    * Convert an Object to a DateTime, without an Exception
    */
   public static java.util.Date getDateTime( Object value )
   {
       try
       {
           return toDateTime( value );
       }
       catch( ParseException pe )
       {
           pe.printStackTrace();
           return null;
       }
   }
   
   /**
    * Convert an Object to a DateTime.
    */
   public static java.util.Date toDateTime( Object value ) throws ParseException
   {
       if( value == null ) return null;        
       if( value instanceof java.util.Date ) return (java.util.Date)value;
       if( value instanceof String )
       {
           if( "".equals( (String)value ) ) return null;
           return IN_DATETIME_FORMAT.parse( (String)value );
       }
               
       return IN_DATETIME_FORMAT.parse( value.toString() );
   }
   
   /**
    * Convert an Object to a Date, without an Exception
    */
   public static java.sql.Date getDate( Object value )
   {
       try
       {
           return toDate( value );
       }
       catch( ParseException pe )
       {
           pe.printStackTrace();
           return null;
       }
   }
   /**
    * Convert an Object to a Date.
    */
   public static java.sql.Date toDate( Object value ) throws ParseException
   {
       if( value == null ) return null;        
       if( value instanceof java.sql.Date ) return (java.sql.Date)value;
       if( value instanceof String )
       {
           if( "".equals( (String)value ) ) return null;
           return new java.sql.Date( IN_DATE_FORMAT.parse( (String)value ).getTime() );
       }
               
       return new java.sql.Date( IN_DATE_FORMAT.parse( value.toString() ).getTime() );
   }
   
   /**
    * Convert an Object to a Time, without an Exception
    */
   public static java.sql.Time getTime( Object value )
   {
       try
       {
           return toTime( value );
       }
       catch( ParseException pe )
       {
           pe.printStackTrace();
           return null;
       }
   }
   
   /**
    * Convert an Object to a Time.
    */
   public static java.sql.Time toTime( Object value ) throws ParseException
   {
       if( value == null ) return null;        
       if( value instanceof java.sql.Time ) return (java.sql.Time)value;
       if( value instanceof String )
       {
           if( "".equals( (String)value ) ) return null;
           return new java.sql.Time( IN_TIME_FORMAT.parse( (String)value ).getTime() );
       }
               
       return new java.sql.Time( IN_TIME_FORMAT.parse( value.toString() ).getTime() );
   }
   
   /**
    * Convert an Object to a Timestamp, without an Exception
    */
   public static java.sql.Timestamp getTimestamp( Object value )
   {
       try
       {
           return toTimestamp( value );
       }
       catch( ParseException pe )
       {
           pe.printStackTrace();
           return null;
       }
   }
   /**
    * Convert an Object to a Timestamp.
    */
   public static java.sql.Timestamp toTimestamp( Object value ) throws ParseException
   {
       if( value == null ) return null;        
       if( value instanceof java.sql.Timestamp ) return (java.sql.Timestamp)value;
       if( value instanceof String )
       {
           if( "".equals( (String)value ) ) return null;
           return new java.sql.Timestamp( IN_TIMESTAMP_FORMAT.parse( (String)value ).getTime() );
       }
               
       return new java.sql.Timestamp( IN_TIMESTAMP_FORMAT.parse( value.toString() ).getTime() );
   }
   
   /**
    * Tells you if the date part of a datetime is in a certain time range.
    */
   public static boolean isTimeInRange( java.sql.Time start, java.sql.Time end, java.util.Date d )
   {
       d=new java.sql.Time(d.getHours(),d.getMinutes(),d.getSeconds());
       
       if (start==null || end==null)
       {
           return false;
       }
       
       if (start.before(end)&&(!(d.after(start)&&d.before(end))))
       {
           return false;
       }
       
       if (end.before(start)&&(!(d.after(end)||d.before(start))))
       {
           return false;
       }   
       return true;
   }
   public static  int getYear( Date date )
   {
       calendar.setTime( date );
       return calendar.get( Calendar.YEAR );
   }
   public static int getMonth( Date date )
   {
       calendar.setTime( date );
       return calendar.get( Calendar.MONTH );
   }
   public static int getDate( Date date )
   {
       calendar.setTime( date );
       return calendar.get( Calendar.DATE );
   }
   public static int getHour( Date date )
   {
       calendar.setTime( date );
       return calendar.get( Calendar.HOUR );
   }
   public static int getMinute( Date date )
   {
       calendar.setTime( date );
       return calendar.get( Calendar.MINUTE );
   }
   public static int getSeconds( Date date )
   {
       calendar.setTime( date );
       return calendar.get( Calendar.SECOND );
   }
   public static int getMillisecond( Date date )
   {
       calendar.setTime( date );
       return calendar.get( Calendar.MILLISECOND );
   }
   
   /**
    * Convert an Object to a String using Dates
    */
   public static String toString( Object date )
   {
       if( date == null ) return null;
       
       if( java.sql.Timestamp.class.isAssignableFrom( date.getClass() ) )
       {
           return OUT_TIMESTAMP_FORMAT.format( date );
       }
       if( java.sql.Time.class.isAssignableFrom( date.getClass() ) )
       {
           return OUT_TIME_FORMAT.format( date );
       }
       if( java.sql.Date.class.isAssignableFrom( date.getClass() ) )
       {
           return OUT_DATE_FORMAT.format( date );
       }
       if( java.util.Date.class.isAssignableFrom( date.getClass() ) )
       {
           return OUT_DATETIME_FORMAT.format( date );
       }
       
       throw new IllegalArgumentException( "Unsupported type " + date.getClass() );
   }

}


 </source>
   
  
 
  



Convert an Object to a Timestamp, without an Exception

   <source lang="java">
 

/*

* Copyright Javelin Software, All rights reserved.
*/

import java.util.*; import java.text.*; /**

* The DateUtil is used as a Utility Class for Dates.
* 
* @author Robin Sharp
*/

public class DateUtil {

   public final static long SECOND_MILLIS = 1000;
   public final static long MINUTE_MILLIS = SECOND_MILLIS*60;
   public final static long HOUR_MILLIS = MINUTE_MILLIS*60;
   public final static long DAY_MILLIS = HOUR_MILLIS*24;
   public final static long YEAR_MILLIS = DAY_MILLIS*365;
   public static DateFormat OUT_DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy");
   public static DateFormat OUT_TIME_FORMAT = new SimpleDateFormat("H:mm:ss");
   public static DateFormat OUT_DATETIME_FORMAT = new SimpleDateFormat("d/M/yyyy H:mm:ss");
   public static DateFormat OUT_TIMESTAMP_FORMAT = new SimpleDateFormat("d/M/yy H:mm:ss.SSS");
   
   public static DateFormat IN_DATE_FORMAT = new SimpleDateFormat("d/M/yy");
   public static DateFormat IN_TIME_FORMAT = new SimpleDateFormat("H:mm:ss");
   public static DateFormat IN_DATETIME_FORMAT = new SimpleDateFormat("d/M/yy H:mm:ss");
   public static DateFormat IN_TIMESTAMP_FORMAT = new SimpleDateFormat("d/M/yy H:mm:ss.SSS");
   
   public static DateFormat DATE_TIME_FORMAT= new SimpleDateFormat( "yyyyMMddkkmmss" );  
   public static Calendar calendar = new GregorianCalendar();
   static
   {
       IN_DATE_FORMAT.setLenient(false);
       IN_TIME_FORMAT.setLenient(false);
       IN_DATETIME_FORMAT.setLenient(false);
   }
   /**
    * Create a new DateTime. To the last second. This will not create any 
    * extra-millis-seconds, which may cause bugs when writing to stores such as
    * databases that round milli-seconds up and down. 
    */
   public static java.util.Date newDateTime()
   {
       return new java.util.Date( (System.currentTimeMillis()/SECOND_MILLIS)*SECOND_MILLIS);
   }
   /**
    * Create a new Date. To the last day.
    */
   public static java.sql.Date newDate()
   {
       return new java.sql.Date( (System.currentTimeMillis()/DAY_MILLIS)*DAY_MILLIS);
   }
   
   /**
    * Create a new Time, with no date component. 
    */
   public static java.sql.Time newTime()
   {
       return new java.sql.Time( System.currentTimeMillis()%DAY_MILLIS);
   }
   
   /**
    * Create a new Timestamp. 
    */
   public static java.sql.Timestamp newTimestamp()
   {
       return new java.sql.Timestamp( System.currentTimeMillis() );
   }
   
   /**
    * Get the seconds difference
    */
   public static int secondsDiff( Date earlierDate, Date laterDate )
   {
       if( earlierDate == null || laterDate == null ) return 0;
       
       return (int)((laterDate.getTime()/SECOND_MILLIS) - (earlierDate.getTime()/SECOND_MILLIS));
   }
   /**
    * Get the minutes difference
    */
   public static int minutesDiff( Date earlierDate, Date laterDate )
   {
       if( earlierDate == null || laterDate == null ) return 0;
       
       return (int)((laterDate.getTime()/MINUTE_MILLIS) - (earlierDate.getTime()/MINUTE_MILLIS));
   }
   
   /**
    * Get the hours difference
    */
   public static int hoursDiff( Date earlierDate, Date laterDate )
   {
       if( earlierDate == null || laterDate == null ) return 0;
       
       return (int)((laterDate.getTime()/HOUR_MILLIS) - (earlierDate.getTime()/HOUR_MILLIS));
   }
   
   /**
    * Get the days difference
    */
   public static int daysDiff( Date earlierDate, Date laterDate )
   {
       if( earlierDate == null || laterDate == null ) return 0;
       
       return (int)((laterDate.getTime()/DAY_MILLIS) - (earlierDate.getTime()/DAY_MILLIS));
   }
   
  /**
   * Roll the java.util.Time forward or backward.
   * @param startDate - The start date
   * @period Calendar.YEAR etc
   * @param amount - Negative to rollbackwards.
   */
   public static java.sql.Time rollTime( java.util.Date startDate, int period, int amount )
   {
       GregorianCalendar gc = new GregorianCalendar();
       gc.setTime(startDate);
       gc.add(period, amount);
       return new java.sql.Time(gc.getTime().getTime());
   }
   
  /**
   * Roll the java.util.Date forward or backward.
   * @param startDate - The start date
   * @period Calendar.YEAR etc
   * @param amount - Negative to rollbackwards.
   */
   public static java.util.Date rollDateTime( java.util.Date startDate, int period, int amount )
   {
       GregorianCalendar gc = new GregorianCalendar();
       gc.setTime(startDate);
       gc.add(period, amount);
       return new java.util.Date(gc.getTime().getTime());
   }
   
  /**
   * Roll the java.sql.Date forward or backward.
   * @param startDate - The start date
   * @period Calendar.YEAR etc
   * @param amount - Negative to rollbackwards.
   */
   public static java.sql.Date rollDate( java.util.Date startDate, int period, int amount )
   {
       GregorianCalendar gc = new GregorianCalendar();
       gc.setTime(startDate);
       gc.add(period, amount);
       return new java.sql.Date(gc.getTime().getTime());
   }
   
  /**
   * Roll the years forward or backward.
   * @param startDate - The start date
   * @param years - Negative to rollbackwards.
   */
   public static java.sql.Date rollYears( java.util.Date startDate, int years )
   {
       return rollDate( startDate, Calendar.YEAR, years );
   }
  /**
   * Roll the days forward or backward.
   * @param startDate - The start date
   * @param months - Negative to rollbackwards.
   */
   public static java.sql.Date rollMonths( java.util.Date startDate, int months )
   {
       return rollDate( startDate, Calendar.MONTH, months );
   }
  /**
   * Roll the days forward or backward.
   * @param startDate - The start date
   * @param days - Negative to rollbackwards.
   */
   public static java.sql.Date rollDays( java.util.Date startDate, int days )
   {
       return rollDate( startDate, Calendar.DATE, days );
   }
   
    /**
     * Checks the day, month and year are equal.
     */
    public static boolean dateEquals( java.util.Date d1, java.util.Date d2 )
    {
       if( d1 == null || d2 == null ) return false;
       
       return d1.getDate() == d2.getDate() &&
              d1.getMonth() == d2.getMonth() &&
              d1.getYear() == d2.getYear();
    }
    
    /**
     * Checks the hour, minute and second are equal.
     */
    public static boolean timeEquals( java.util.Date d1, java.util.Date d2 )
    {
       if( d1 == null || d2 == null ) return false;
       
       return d1.getHours() == d2.getHours() &&
              d1.getMinutes() == d2.getMinutes() &&
              d1.getSeconds() == d2.getSeconds();
    }
   /**
     * Checks the second, hour, month, day, month and year are equal.
     */
    public static boolean dateTimeEquals( java.util.Date d1, java.util.Date d2 )
    {
       if( d1 == null || d2 == null ) return false;               
       
       return d1.getDate() == d2.getDate() &&
              d1.getMonth() == d2.getMonth() &&
              d1.getYear() == d2.getYear() &&
              d1.getHours() == d2.getHours() &&
              d1.getMinutes() == d2.getMinutes() &&
              d1.getSeconds() == d2.getSeconds();
    }
    
    /**
    * Convert an Object of type Classs to an Object.
    */
   public static Object toObject( Class clazz, Object value ) throws ParseException
   {
       if( value == null ) return null;
       if( clazz == null ) return value;
       
       if( java.sql.Date.class.isAssignableFrom( clazz ) ) return toDate( value );
       if( java.sql.Time.class.isAssignableFrom( clazz ) ) return toTime( value );
       if( java.sql.Timestamp.class.isAssignableFrom( clazz ) ) return toTimestamp( value );
       if( java.util.Date.class.isAssignableFrom( clazz ) ) return toDateTime( value );
       
       return value;
   }
   
   /**
    * Convert an Object to a DateTime, without an Exception
    */
   public static java.util.Date getDateTime( Object value )
   {
       try
       {
           return toDateTime( value );
       }
       catch( ParseException pe )
       {
           pe.printStackTrace();
           return null;
       }
   }
   
   /**
    * Convert an Object to a DateTime.
    */
   public static java.util.Date toDateTime( Object value ) throws ParseException
   {
       if( value == null ) return null;        
       if( value instanceof java.util.Date ) return (java.util.Date)value;
       if( value instanceof String )
       {
           if( "".equals( (String)value ) ) return null;
           return IN_DATETIME_FORMAT.parse( (String)value );
       }
               
       return IN_DATETIME_FORMAT.parse( value.toString() );
   }
   
   /**
    * Convert an Object to a Date, without an Exception
    */
   public static java.sql.Date getDate( Object value )
   {
       try
       {
           return toDate( value );
       }
       catch( ParseException pe )
       {
           pe.printStackTrace();
           return null;
       }
   }
   /**
    * Convert an Object to a Date.
    */
   public static java.sql.Date toDate( Object value ) throws ParseException
   {
       if( value == null ) return null;        
       if( value instanceof java.sql.Date ) return (java.sql.Date)value;
       if( value instanceof String )
       {
           if( "".equals( (String)value ) ) return null;
           return new java.sql.Date( IN_DATE_FORMAT.parse( (String)value ).getTime() );
       }
               
       return new java.sql.Date( IN_DATE_FORMAT.parse( value.toString() ).getTime() );
   }
   
   /**
    * Convert an Object to a Time, without an Exception
    */
   public static java.sql.Time getTime( Object value )
   {
       try
       {
           return toTime( value );
       }
       catch( ParseException pe )
       {
           pe.printStackTrace();
           return null;
       }
   }
   
   /**
    * Convert an Object to a Time.
    */
   public static java.sql.Time toTime( Object value ) throws ParseException
   {
       if( value == null ) return null;        
       if( value instanceof java.sql.Time ) return (java.sql.Time)value;
       if( value instanceof String )
       {
           if( "".equals( (String)value ) ) return null;
           return new java.sql.Time( IN_TIME_FORMAT.parse( (String)value ).getTime() );
       }
               
       return new java.sql.Time( IN_TIME_FORMAT.parse( value.toString() ).getTime() );
   }
   
   /**
    * Convert an Object to a Timestamp, without an Exception
    */
   public static java.sql.Timestamp getTimestamp( Object value )
   {
       try
       {
           return toTimestamp( value );
       }
       catch( ParseException pe )
       {
           pe.printStackTrace();
           return null;
       }
   }
   /**
    * Convert an Object to a Timestamp.
    */
   public static java.sql.Timestamp toTimestamp( Object value ) throws ParseException
   {
       if( value == null ) return null;        
       if( value instanceof java.sql.Timestamp ) return (java.sql.Timestamp)value;
       if( value instanceof String )
       {
           if( "".equals( (String)value ) ) return null;
           return new java.sql.Timestamp( IN_TIMESTAMP_FORMAT.parse( (String)value ).getTime() );
       }
               
       return new java.sql.Timestamp( IN_TIMESTAMP_FORMAT.parse( value.toString() ).getTime() );
   }
   
   /**
    * Tells you if the date part of a datetime is in a certain time range.
    */
   public static boolean isTimeInRange( java.sql.Time start, java.sql.Time end, java.util.Date d )
   {
       d=new java.sql.Time(d.getHours(),d.getMinutes(),d.getSeconds());
       
       if (start==null || end==null)
       {
           return false;
       }
       
       if (start.before(end)&&(!(d.after(start)&&d.before(end))))
       {
           return false;
       }
       
       if (end.before(start)&&(!(d.after(end)||d.before(start))))
       {
           return false;
       }   
       return true;
   }
   public static  int getYear( Date date )
   {
       calendar.setTime( date );
       return calendar.get( Calendar.YEAR );
   }
   public static int getMonth( Date date )
   {
       calendar.setTime( date );
       return calendar.get( Calendar.MONTH );
   }
   public static int getDate( Date date )
   {
       calendar.setTime( date );
       return calendar.get( Calendar.DATE );
   }
   public static int getHour( Date date )
   {
       calendar.setTime( date );
       return calendar.get( Calendar.HOUR );
   }
   public static int getMinute( Date date )
   {
       calendar.setTime( date );
       return calendar.get( Calendar.MINUTE );
   }
   public static int getSeconds( Date date )
   {
       calendar.setTime( date );
       return calendar.get( Calendar.SECOND );
   }
   public static int getMillisecond( Date date )
   {
       calendar.setTime( date );
       return calendar.get( Calendar.MILLISECOND );
   }
   
   /**
    * Convert an Object to a String using Dates
    */
   public static String toString( Object date )
   {
       if( date == null ) return null;
       
       if( java.sql.Timestamp.class.isAssignableFrom( date.getClass() ) )
       {
           return OUT_TIMESTAMP_FORMAT.format( date );
       }
       if( java.sql.Time.class.isAssignableFrom( date.getClass() ) )
       {
           return OUT_TIME_FORMAT.format( date );
       }
       if( java.sql.Date.class.isAssignableFrom( date.getClass() ) )
       {
           return OUT_DATE_FORMAT.format( date );
       }
       if( java.util.Date.class.isAssignableFrom( date.getClass() ) )
       {
           return OUT_DATETIME_FORMAT.format( date );
       }
       
       throw new IllegalArgumentException( "Unsupported type " + date.getClass() );
   }

}


 </source>
   
  
 
  



Convert into java.sql.Time (or into java.util.Calendar)

   <source lang="java">

import java.sql.Time; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; /**

* Provides methods helpful in making object conversions not provided for by the
* Sun or MyFaces distributions.
* 
* @author 
* 
*/

public class ConversionUtil {

 /**
  * convert into java.sql.Time (or into java.util.Calendar
  * 
  * @param date
  *          The date containing the time.
  * @param am
  *          Whether this should be am (true) or pm (false)
  * @return
  */
 public static Time convertDateToTime(Date date, boolean am) {
   if (date == null) {
     return null;
   }
   Calendar cal = new GregorianCalendar();
   cal.setTime(date);
   int hourOfDay = cal.get(Calendar.HOUR_OF_DAY);
   if (am) {
     // Check to make sure that the hours are indeed am hours
     if (hourOfDay > 11) {
       cal.set(Calendar.HOUR_OF_DAY, hourOfDay - 12);
       date.setTime(cal.getTimeInMillis());
     }
   } else {
     // Check to make sure that the hours are indeed pm hours
     if (cal.get(Calendar.HOUR_OF_DAY) < 11) {
       cal.set(Calendar.HOUR_OF_DAY, hourOfDay + 12);
       date.setTime(cal.getTimeInMillis());
     }
   }
   return new Time(date.getTime());
 }

}

 </source>
   
  
 
  



Convert java.sql.Timestamp to long for easy compare

   <source lang="java">
 

public class DateLabel {

 public static void main(String[] args) {
   java.util.Date today = new java.util.Date();
   java.sql.Timestamp ts1 = new java.sql.Timestamp(today.getTime());
   java.sql.Timestamp ts2 = java.sql.Timestamp.valueOf("2005-04-06 09:01:10");
   long tsTime1 = ts1.getTime();
   long tsTime2 = ts2.getTime();
   
   System.out.println(tsTime1);
   System.out.println(tsTime2);
 }

}


 </source>
   
  
 
  



convert Strings to Dates and Timestamps and vice versa.

   <source lang="java">
 

/*

*  Copyright 2004 Blandware (http://www.blandware.ru)
*
*  Licensed under the Apache License, Version 2.0 (the "License");
*  you may not use this file except in compliance with the License.
*  You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
*  Unless required by applicable law or agreed to in writing, software
*  distributed under the License is distributed on an "AS IS" BASIS,
*  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*  See the License for the specific language governing permissions and
*  limitations under the License.
*/

import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.HashMap;

/**

*

Date Utility Class. * This is used to convert Strings to Dates and Timestamps and vice versa. *

*

* @version $Revision: 1.12 $ $Date: 2008/01/14 10:59:49 $ */ public class DateUtil { protected static String datePattern = "MM/dd/yyyy"; protected static HashMap patterns = new HashMap(); /** * Formats given date according to specified locale and date style * * @param date Date to convert * @param locale Locale to use for formatting date * @param dateStyle Date style * @return String representation of date according to given locale and date style * @see java.text.DateFormat */ public static String formatDate(Date date, Locale locale, int dateStyle) { DateFormat formatter = DateFormat.getDateInstance(dateStyle, locale); return formatter.format(date); } /** * Formats given date according to specified locale and DateFormat.MEDIUM style * * @param date Date to convert * @param locale Locale to use for formatting date * @return String representation of date according to given locale and DateFormat.MEDIUM style * @see java.text.DateFormat * @see java.text.DateFormat#MEDIUM */ public static String formatDate(Date date, Locale locale) { return formatDate(date, locale, DateFormat.MEDIUM); } /** * Parses given string according to specified locale and date style * * @param source Source string to parse date from * @param locale Locale to use for parsing date * @param dateStyle Date style * @return Date object corresponding to representation given in source string * @throws ParseException if given string could not be properly parsed according to given locale and style * @see java.text.DateFormat */ public static Date parseDate(String source, Locale locale, int dateStyle) throws ParseException { DateFormat formatter = DateFormat.getDateInstance(dateStyle, locale); return formatter.parse(source); } /** * Parses given string according to specified locale and DateFormat.MEDIUM style * * @param source Source string to parse date from * @param locale Locale to use for parsing date * @return Date object corresponding to representation given in source string * @throws ParseException if given string could not be properly parsed according to given locale and DateFormat.MEDIUM style * @see java.text.DateFormat * @see java.text.DateFormat#MEDIUM */ public static Date parseDate(String source, Locale locale) throws ParseException { return parseDate(source, locale, DateFormat.MEDIUM); } /** * Formats given time according to specified locale and time style * * @param time Time to convert * @param locale Locale to use for formatting time * @param timeStyle Time style * @return String representation of time according to given locale and time style * @see java.text.DateFormat */ public static String formatTime(Date time, Locale locale, int timeStyle) { DateFormat formatter = DateFormat.getTimeInstance(timeStyle, locale); return formatter.format(time); } /** * Formats given time according to specified locale and DateFormat.MEDIUM style * * @param time Time to convert * @param locale Locale to use for formatting time * @return String representation of time according to given locale and DateFormat.MEDIUM style * @see java.text.DateFormat * @see java.text.DateFormat#MEDIUM */ public static String formatTime(Date time, Locale locale) { return formatTime(time, locale, DateFormat.MEDIUM); } /** * Parses given string according to specified locale and time style * * @param source Source string to parse time from * @param locale Locale to use for parsing time * @param timeStyle Time style * @return Time object corresponding to representation given in source string * @throws ParseException if given string could not be properly parsed according to given locale and style * @see java.text.DateFormat */ public static Date parseTime(String source, Locale locale, int timeStyle) throws ParseException { DateFormat formatter = DateFormat.getTimeInstance(timeStyle, locale); return formatter.parse(source); } /** * Parses given string according to specified locale and DateFormat.MEDIUM style * * @param source Source string to parse time from * @param locale Locale to use for parsing time * @return Time object corresponding to representation given in source string * @throws ParseException if given string could not be properly parsed according to given locale and DateFormat.MEDIUM style * @see java.text.DateFormat * @see java.text.DateFormat#MEDIUM */ public static Date parseTime(String source, Locale locale) throws ParseException { return parseTime(source, locale, DateFormat.MEDIUM); } /** * Formats given date and time according to specified locale and date style * * @param date Date object to convert * @param locale Locale to use for formatting date and time * @param dateStyle Date style * @param timeStyle Time style * @return String representation of date and time according to given locale and date style * @see java.text.DateFormat */ public static String formatDateTime(Date date, Locale locale, int dateStyle, int timeStyle) { DateFormat formatter = DateFormat.getDateTimeInstance(dateStyle, timeStyle, locale); return formatter.format(date); } /** * Formats given date and time according to specified locale and DateFormat.MEDIUM style * * @param date Date object to convert * @param locale Locale to use for formatting date and time * @return String representation of date and time according to given locale and DateFormat.MEDIUM style * @see java.text.DateFormat * @see java.text.DateFormat#MEDIUM */ public static String formatDateTime(Date date, Locale locale) { return formatDateTime(date, locale, DateFormat.MEDIUM, DateFormat.MEDIUM); } /** * Parses given string according to specified locale and date and time styles * * @param source Source string to parse date and time from * @param locale Locale to use for parsing date and time * @param dateStyle Date style * @param timeStyle Time style * @return Date object corresponding to representation given in source string * @throws ParseException if given string could not be properly parsed according to given locale and style * @see java.text.DateFormat */ public static Date parseDateTime(String source, Locale locale, int dateStyle, int timeStyle) throws ParseException { DateFormat formatter = DateFormat.getDateTimeInstance(dateStyle, timeStyle, locale); return formatter.parse(source); } /** * Parses given string according to specified locale and DateFormat.MEDIUM style * * @param source Source string to parse date and time from * @param locale Locale to use for parsing date and time * @return Date object corresponding to representation given in source string * @throws ParseException if given string could not be properly parsed according to given locale and DateFormat.MEDIUM style * @see java.text.DateFormat * @see java.text.DateFormat#MEDIUM */ public static Date parseDateTime(String source, Locale locale) throws ParseException { return parseDateTime(source, locale, DateFormat.MEDIUM, DateFormat.MEDIUM); } /** * Formats given Date object according to specified locale and a given * pattern. * * @param date Date object to convert * @param locale Locale to use for formatting * @param pattern Pattern to use * @return String representation of date and time according to given locale and DateFormat.MEDIUM style * @see java.text.SimpleDateFormat */ public static String format(Date date, Locale locale, String pattern) { SimpleDateFormat formatter = new SimpleDateFormat(pattern, locale); return formatter.format(date); } /** * Parses given string according to specified locale and a given pattern. * * @param source Source string to parse date and time from * @param locale Locale to use for parsing date and time * @param pattern Pattern to use * @return Date object corresponding to representation given in source * string * @throws ParseException if given string could not be properly parsed * according to given locale and pattern * @see java.text.SimpleDateFormat */ public static Date parse(String source, Locale locale, String pattern) throws ParseException { SimpleDateFormat formatter = new SimpleDateFormat(pattern, locale); return formatter.parse(source); } /** * Returns default datePattern (MM/dd/yyyy) * * @return a string representing the date pattern on the UI */ public static String getDatePattern() { return datePattern; } /** * Gets date pattern without time symbols according to given locale and date style * * @param locale Locale to searh pattern for * @param dateStyle Date style to search pattern by * @return Date pattern without time symbols */ public static String getDatePattern(Locale locale, int dateStyle) { String id = locale.toString() + "+" + dateStyle; String pattern = (String) patterns.get(id); if (pattern == null) { SimpleDateFormat format = (SimpleDateFormat) DateFormat.getDateInstance(dateStyle, locale); pattern = format.toPattern(); patterns.put(id, pattern); } return pattern; } /** * Gets date pattern without time symbols according to given locale in MEDIUM style * * @param locale Locale to searh pattern for * @return Date pattern without time symbols in medium format * @see java.text.DateFormat#MEDIUM */ public static String getDatePattern(Locale locale) { return getDatePattern(locale, DateFormat.MEDIUM); } } </source>

Get Date From MySql

   <source lang="java">
 

import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class GetDateFromMySql {

 public static Connection getMySQLConnection() throws Exception {
   String driver = "org.gjt.mm.mysql.Driver";
   String url = "jdbc:mysql://localhost/databaseName";
   String username = "root";
   String password = "root";
   Class.forName(driver);
   return DriverManager.getConnection(url, username, password);
 }
 public static void main(String args[]) {
   ResultSet rs = null;
   Connection conn = null;
   Statement stmt = null;
   try {
     conn = getMySQLConnection();
     stmt = conn.createStatement();
     rs = stmt.executeQuery("select timeCol, dateCol, dateTimeCol from dateTimeTable");
     while (rs.next()) {
       java.sql.Time dbSqlTime = rs.getTime(1);
       java.sql.Date dbSqlDate = rs.getDate(2);
       java.sql.Timestamp dbSqlTimestamp = rs.getTimestamp(3);
       System.out.println("dbSqlTime=" + dbSqlTime);
       System.out.println("dbSqlDate=" + dbSqlDate);
       System.out.println("dbSqlTimestamp=" + dbSqlTimestamp);
       java.util.Date dbSqlTimeConverted = new java.util.Date(dbSqlTime.getTime());
       java.util.Date dbSqlDateConverted = new java.util.Date(dbSqlDate.getTime());
       System.out.println("in standard date");
       System.out.println(dbSqlTimeConverted);
       System.out.println(dbSqlDateConverted);
     }
   } catch (Exception e) {
     e.printStackTrace();
   } finally {
     try {
       rs.close();
       stmt.close();
       conn.close();
     } catch (SQLException e) {
       e.printStackTrace();
     }
   }
 }

}


 </source>
   
  
 
  



Get date from Oracle

   <source lang="java">
 

import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class GetDateFromOracle {

 public static Connection getConnection() throws Exception {
   String driver = "oracle.jdbc.driver.OracleDriver";
   String url = "jdbc:oracle:thin:@localhost:1521:databaseName";
   Class.forName(driver);
   return DriverManager.getConnection(url, "name", "password");
 }
 public static void main(String args[]) {
   String GET_RECORD = "select date_column, time_column, "
       + "timestamp_column from TestDates where id = ?";
   ResultSet rs = null;
   Connection conn = null;
   PreparedStatement pstmt = null;
   try {
     conn = getConnection();
     pstmt = conn.prepareStatement(GET_RECORD);
     pstmt.setString(1, "0001");
     rs = pstmt.executeQuery();
     while (rs.next()) {
       java.sql.Date dbSqlDate = rs.getDate(1);
       java.sql.Time dbSqlTime = rs.getTime(2);
       java.sql.Timestamp dbSqlTimestamp = rs.getTimestamp(3);
       System.out.println("dbSqlDate=" + dbSqlDate);
       System.out.println("dbSqlTime=" + dbSqlTime);
       System.out.println("dbSqlTimestamp=" + dbSqlTimestamp);
     }
   } catch (Exception e) {
     e.printStackTrace();
   } finally {
     try {
       rs.close();
       pstmt.close();
       conn.close();
     } catch (SQLException e) {
       e.printStackTrace();
     }
   }
 }

}


 </source>
   
  
 
  



Get java.sql.Timestamp fro current time

   <source lang="java">
 

public class DateLabel {

 public static void main(String[] args) {
   java.util.Date today = new java.util.Date();
   System.out.println(new java.sql.Timestamp(today.getTime()));
 }

}


 </source>
   
  
 
  



Insert Date, time and date time data to Oracle

   <source lang="java">
 

import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; public class InsertDateToOracle {

 public static Connection getConnection() throws Exception {
   String driver = "oracle.jdbc.driver.OracleDriver";
   String url = "jdbc:oracle:thin:@localhost:1521:databaseName";
   Class.forName(driver);
   return DriverManager.getConnection(url, "userName", "password");
 }
 public static void main(String args[])throws Exception {
   String INSERT_RECORD = "insert into TestDates(id, date_column, "
       + "time_column, timestamp_column) values(?, ?, ?, ?)";
   Connection conn = null;
   PreparedStatement pstmt = null;
   try {
     conn = getConnection();
     pstmt = conn.prepareStatement(INSERT_RECORD);
     pstmt.setString(1, "001");
     java.util.Date date = new java.util.Date();
     long t = date.getTime();
     java.sql.Date sqlDate = new java.sql.Date(t);
     java.sql.Time sqlTime = new java.sql.Time(t);
     java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(t);
     System.out.println("sqlDate=" + sqlDate);
     System.out.println("sqlTime=" + sqlTime);
     System.out.println("sqlTimestamp=" + sqlTimestamp);
     pstmt.setDate(2, sqlDate);
     pstmt.setTime(3, sqlTime);
     pstmt.setTimestamp(4, sqlTimestamp);
     pstmt.executeUpdate();
   } catch (Exception e) {
     e.printStackTrace();
     System.out.println("Failed to insert the record.");
   } finally {
     pstmt.close();
     conn.close();
   }
 }

}


 </source>
   
  
 
  



Parse date and time

   <source lang="java">
 

/**

* Copyright (c) 2003 - 2007 OpenSubsystems s.r.o. Slovak Republic. All rights reserved.
* 
* Project: OpenSubsystems
* 
* $Id: DateUtils.java,v 1.7 2007/01/07 06:14:00 bastafidli Exp $
* 
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License. 
* 
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
* 
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
*/

import java.sql.Timestamp; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar;

/**

* Collection of useful utilities to work with dates. 
* 
* @version $Id: DateUtils.java,v 1.7 2007/01/07 06:14:00 bastafidli Exp $
* @author Miro Halas
* @code.reviewer Miro Halas
* @code.reviewed 1.5 2005/09/13 13:23:15 bastafidli
*/

public final class DateUtils {

  // Constants ////////////////////////////////////////////////////////////////
  
  /**
   * One second in milliseconds.
   */
  public static final long ONE_SECOND = 1000L;
  
  /**
   * One minute in milliseconds.
   */
  public static final long ONE_MINUTE = ONE_SECOND * 60L;
  
  /**
   * One hour in milliseconds.
   */
  public static final long ONE_HOUR = ONE_MINUTE * 60L;
  
  /**
   * One day in milliseconds.
   */
  public static final long ONE_DAY = ONE_HOUR * 24L;
  
  /**
   * Separator we used to separate time from the nanosecond portion of the 
   * timestamp when converted to string.
   */
  public static final char NANO_SEPARATOR = ":";
  
  /**
   * Constant for timing type
   */
  public static final int TIMING_NEVER = 0;
  /**
   * Constant for timing type
   */
  public static final int TIMING_MINUTES = 1;
  /**
   * Constant for timing type
   */
  public static final int TIMING_HOURS = 2;
  /**
   * Constant for timing type
   */
  public static final int TIMING_DAYS = 3;
  /**
   * Constant for timing type
   */
  public static final int TIMING_WEEKS = 4;
  /**
   * Constant for timing type
   */
  public static final int TIMING_MONTHS = 5;
  /**
   * Constant for timing type
   */
  public static final int TIMING_YEARS = 6;
  
  /**
   * Constant for timing type
   */
  public static final int TIMING_NONE = 7;
  /**
   * Constant for current date code used in date/time formulas 
   */
  public static final String CURRENT_DATE_CODE = "now";
  
  /**
   * Constant for dynamic date code used in date/time formulas
   */
  public static final char YEAR_CODE = "y";
  
  /**
   * Constant for dynamic date code used in date/time formulas
   */
  public static final char MONTH_CODE = "M";
  /**
   * Constant for dynamic date code used in date/time formulas
   */
  public static final char WEEK_CODE = "w";
  /**
   * Constant for dynamic date code used in date/time formulas
   */
  public static final char DAY_CODE = "d";
  /**
   * Constant for dynamic date code used in date/time formulas
   */
  public static final char HOUR_CODE = "h";
  /**
   * Constant for dynamic date code used in date/time formulas
   */
  public static final char MINUTE_CODE = "m";
  
  /**
   * Constant for dynamic date code used in date/time formulas
   */
  public static final char SECOND_CODE = "s";
  /**
   * constant for date type DATE
   */
  public static final int DATE_TYPE_DATE = 1;
  /**
   * constant for date type TIME
   */
  public static final int DATE_TYPE_TIME = 2;
  /**
   * constant for date type DATETIME
   */
  public static final int DATE_TYPE_DATETIME = 3;
  
  // Constants for period start types /////////////////////////////////////////

// TODO: For Miro: Remove this code once all the code which referred to these // constants was fixed // /** // * constant for period type // */ // public static final int PERIOD_START_TYPE_NONE = 0; // // /** // * constant for period type // */ // public static final int PERIOD_START_TYPE_CREATION = 1; // // /** // * constant for period type // */ // public static final int PERIOD_START_TYPE_COMPLETION = 2; // // /** // * constant for period type // */ // public static final int PERIOD_START_TYPE_APPROVAL = 3; // // /** // * constant for period type // */ // public static final int PERIOD_START_TYPE_ACTIVATION = 4; // // /** // * constant for period type // */ // public static final int PERIOD_START_TYPE_INACTIVATION = 5; // // /** // * constant for period type // */ // public static final int PERIOD_START_TYPE_DYNAMIC = 6; // // /** // * constant for period type code // */ // public static final int PERIOD_TYPE_CODE = 99; // // /** // * constant for period type object // */ // public static final Integer PERIOD_TYPE_OBJ = new Integer(PERIOD_TYPE_CODE);

  // Cached variables /////////////////////////////////////////////////////////
  
  /**
   * static SimpleDateFormat for date format to display on UI and in messages.
   */
  public static final SimpleDateFormat DATE_FORMAT 
                         = (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.SHORT);
  
  /**
   * static SimpleDateFormat for time format to display on UI and in messages.
   */
  public static final SimpleDateFormat TIME_FORMAT 
                         = (SimpleDateFormat) DateFormat.getTimeInstance(DateFormat.MEDIUM);
  
  /**
   * static SimpleDateFormat for datetime format to display on UI and in messages.
   */
  public static final SimpleDateFormat DATETIME_FORMAT 
                         = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.SHORT, 
                                                          DateFormat.MEDIUM); 
  /**
   * static SimpleDateFormat for date format to store date as string so that
   * it is stored consistently.
   */
  public static final SimpleDateFormat DATE_STORE_FORMAT
                         = new SimpleDateFormat("MM/dd/yyyy");
  
  /**
   * static SimpleDateFormat for time format to store time as string so that
   * it is stored consistently.
   */
  public static final SimpleDateFormat TIME_STORE_FORMAT 
                         = new SimpleDateFormat("HH:mm:ss");
  
  /**
   * static SimpleDateFormat for datetime format to store date and time as 
   * string so that it is stored consistently.
   */
  public static final SimpleDateFormat DATETIME_STORE_FORMAT 
                         = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
  /**
   * static SimpleDateFormat for date format for sql date
   */
  public static final SimpleDateFormat DATE_SQL_FORMAT
                         = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
  
  /**
   * static SimpleDateFormat for time format for sql time
   */
  public static final SimpleDateFormat TIME_SQL_FORMAT 
                         = new SimpleDateFormat("1970-01-01 HH:mm:ss");
  
  /**
   * static SimpleDateFormat for datetime format for sql date and time
   */
  public static final SimpleDateFormat DATETIME_SQL_FORMAT 
                         = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  // Constructors /////////////////////////////////////////////////////////////
  
  /** 
   * Private constructor since this class cannot be instantiated
   */
  private DateUtils(
  )
  {
     // Do nothing
  }
  
  // Public methods ///////////////////////////////////////////////////////////
  
  /**
   * Check if two dates equals regardless of the time. Two null dates are equal. 
   * Null and not null dates are not equal.
   * 
   * @param  dtFirst - first date to compare, can be null
   * @param  dtSecond - second date to compare, can be null 
   * @return boolean - true if two dates equals regardless of what the time is 
   */
  public static boolean dateEquals(
     Date dtFirst,
     Date dtSecond
  )
  {
     boolean  bReturn = false;
     
     // If they are the same object, they are equals
     bReturn = (dtFirst == dtSecond);
     if (!bReturn)
     {
        if (dtFirst == null)
        {
           // Two null dates are the same
           bReturn = (dtSecond == null);
        }
        else
        {
           if (dtSecond != null)
           {
              Calendar compCalendar;
              int      iEra;
              int      iYear;
              int      iMonth;
              int      iDay;
              
              compCalendar = Calendar.getInstance();
              compCalendar.setTime(dtFirst);
              iEra   = compCalendar.get(Calendar.ERA);
              iYear  = compCalendar.get(Calendar.YEAR);
              iMonth = compCalendar.get(Calendar.MONTH);
              iDay   = compCalendar.get(Calendar.DATE);
              compCalendar.setTime(dtSecond);
        
              bReturn = ((iEra == compCalendar.get(Calendar.ERA))
                        && (iYear == compCalendar.get(Calendar.YEAR))
                        && (iMonth == compCalendar.get(Calendar.MONTH))
                        && (iDay == compCalendar.get(Calendar.DATE)));
           }
        }
     } 
           
     return bReturn;            
  }
  
  /**
   * Check if two times equals regardless of the date. Two null times are equal. 
   * Null and not null times are not equal.
   * 
   * @param  dtFirst - first time to compare, can be null
   * @param  dtSecond - second time to compare, can be null
   * @param  bIgnoreMilliseconds - if true milliseconds will be ignored in comparison
   * @return boolean - true if two time equals regardless of what the date is 
   */
  public static boolean timeEquals(
     Date    dtFirst,
     Date    dtSecond,
     boolean bIgnoreMilliseconds
  )
  {
     boolean  bReturn = false;
     
     // If they are the same object, they are equals
     bReturn = (dtFirst == dtSecond);
     if (!bReturn)
     {
        if (dtFirst == null)
        {
           // Two null dates are the same
           bReturn = (dtSecond == null);
        }
        else
        {
           if (dtSecond != null)
           {
              Calendar compCalendar;
              int      iHour;
              int      iMinute;
              int      iSecond;
              int      iMili;
              
              compCalendar = Calendar.getInstance();
              compCalendar.setTime(dtFirst);
              iHour   = compCalendar.get(Calendar.HOUR_OF_DAY);
              iMinute = compCalendar.get(Calendar.MINUTE);
              iSecond = compCalendar.get(Calendar.SECOND);
              iMili   = compCalendar.get(Calendar.MILLISECOND);
              compCalendar.setTime(dtSecond);
        
              bReturn = ((iHour == compCalendar.get(Calendar.HOUR_OF_DAY))
                        && (iMinute == compCalendar.get(Calendar.MINUTE))
                        && (iSecond == compCalendar.get(Calendar.SECOND))
                        && ((bIgnoreMilliseconds) 
                           || (iMili == compCalendar.get(Calendar.MILLISECOND))));
           }
        }
     } 
           
     return bReturn;            
  }
  /**
   * Check if two dates and times are equal. Two null dates are equal. Null 
   * and not null dates are not equal.
   * 
   * @param  dtFirst - first date time to compare, can be null
   * @param  dtSecond - second date time to compare, can be null
   * @return boolean - true if two date and times are equal 
   */
  public static boolean dateAndTimeEquals(
     Date dtFirst,
     Date dtSecond
  )
  {
     boolean bReturn = false;
     
     // If they are the same object, they are equals
     bReturn = (dtFirst == dtSecond);
     if (!bReturn)
     {
        if (dtFirst == null)
        {
           // Two null dates are the same
           bReturn = (dtSecond == null);
        }
        else
        {
           if (dtSecond != null)
           {
              // They are both not null so they have to match to millisecond
              // (actually to nanosecond since the getTime takes nanoseconds
              // into account)
              bReturn = (dtFirst.getTime() == dtSecond.getTime());                               
           }
        }
     }
           
     return bReturn;            
  }
  /**
   * Check if String representing date is function or date. Date is a function
   * (formula) if it starts with the current date/time variable which can be 
   * followed by expression describing period from current date.
   *
   * @param strValue - string representation of date or date function
   * @return boolean - date function flag
   */
  public static boolean isFunction(
     String   strValue
  )
  {
     boolean bReturn = false;
     if ((strValue != null) && (strValue.length() > 0) 
        && (strValue.trim().startsWith(CURRENT_DATE_CODE)))
     {
        bReturn = true;
     }
     
     return bReturn;
  }
  
  /**
   * Parse date time value from given string resolving any functions or formulas
   * the string can contain. This method  can be therefore used if the passed 
   * string contains string representation date, time or timestamp or a formula
   * such as now + 3h - 1m + 4d. 
   *
   * @param strValue - string representation of date or date function
   * @param iDateType - date type code, one of the DATE_TYPE_XXX constants
   * @param stored - flag if Date should be parsed using format used for 
   *                 storage or for display
   * @return Timestamp - parsed date or null if date was null
   * @throws OSSInvalidDataException - error during parsing
   */
  public static Timestamp parseDateTime(
     String   strValue,
     int      iDateType,
     boolean  stored
  )
  {
     Timestamp tsReturn = null;
     Calendar workCal = GregorianCalendar.getInstance();
     
     if (strValue != null && strValue.length() > 0)
     {
        strValue = strValue.trim();
        if (strValue.startsWith(CURRENT_DATE_CODE))
        {
           strValue = strValue.replaceAll("[ ]", "");
           // If the user specified "UseCurrent", then substitute the
           // current date/time in the value
           workCal.setTime(new Date());

// Log.getInstance().debug("Parsing current date " + strValue);

           // Parse the date math
           int iBeginIndex = CURRENT_DATE_CODE.length();
           int iMaxLength = strValue.length();
           int iSign = 1;
           int iNumberIndex;
           int iValue;
           char cChar = " ";
           while (iBeginIndex < iMaxLength)
           {
              // This has to be sign
              if (strValue.charAt(iBeginIndex) == "+")
              {
                 iSign = 1;
              }
              else if (strValue.charAt(iBeginIndex) == "-")
              {
                 iSign = -1;
              }
              else
              {
                 // Incorrect String
                 throw new RuntimeException(
                          "Date function is in incorrect format: "
                          + strValue + " at " + strValue.substring(iBeginIndex));
              }
              iBeginIndex++;
              // Now we have to have number
              iNumberIndex = iBeginIndex;
              
              while (((iBeginIndex == iNumberIndex) || Character.isDigit(cChar)) 
                    && (iBeginIndex < iMaxLength))
              {
                 cChar = strValue.charAt(iBeginIndex++);
              }
              // We have to go one back because we should stop on modifier (e.g 1m)
              iBeginIndex--;
              try
              {
                 iValue = Integer.parseInt(strValue.substring(iNumberIndex, iBeginIndex));
              }
              catch (NumberFormatException nmeExc)
              {
                 // Incorrect String
                 throw new RuntimeException(
                          "Date function is in incorrect format: "
                          + strValue + " at " + strValue.substring(iNumberIndex));
              }
              // This has to be modifier: y - year, M - month, w - week, 
              // d - day, h - hour, m - minute, s - second
              cChar = strValue.charAt(iBeginIndex);
              switch(cChar)
              {
                 case(YEAR_CODE):
                 {
                    if (iDateType == DATE_TYPE_TIME)
                    {
                       throw new RuntimeException(
                          "Date function is in incorrect format: " +
                          "used YEAR modifier for TIME type");
                    }
                    workCal.add(Calendar.YEAR, iSign * iValue);
                    break;
                 }
                 case(MONTH_CODE):
                 {
                    if (iDateType == DATE_TYPE_TIME)
                    {
                       throw new RuntimeException(
                          "Date function is in incorrect format: " +
                          "used MONTH modifier for TIME type");
                    }
                    workCal.add(Calendar.MONTH, iSign * iValue);
                    break;
                 }
                 case(WEEK_CODE):
                 {
                    if (iDateType == DATE_TYPE_TIME)
                    {
                       throw new RuntimeException(
                          "Date function is in incorrect format: " +
                          "used WEEK modifier for TIME type");
                    }
                    workCal.add(Calendar.WEEK_OF_YEAR, iSign * iValue);
                    break;
                 }
                 case(DAY_CODE):
                 {
                    if (iDateType == DATE_TYPE_TIME)
                    {
                       throw new RuntimeException(
                          "Date function is in incorrect format: " +
                          "used DAY modifier for TIME type");
                    }
                    workCal.add(Calendar.DATE, iSign * iValue);
                    break;
                 }
                 case(HOUR_CODE):
                 {
                    if (iDateType == DATE_TYPE_DATE)
                    {
                       throw new RuntimeException(
                          "Date function is in incorrect format: " +
                          "used HOUR modifier for DATE type");
                    }
                    workCal.add(Calendar.HOUR, iSign * iValue);
                    break;
                 }
                 case(MINUTE_CODE):
                 {
                    if (iDateType == DATE_TYPE_DATE)
                    {
                       throw new RuntimeException(
                          "Date function is in incorrect format: " +
                          "used MINUTE modifier for DATE type");
                    }
                    workCal.add(Calendar.MINUTE, iSign * iValue);
                    break;
                 }
                 case(SECOND_CODE):
                 {
                    if (iDateType == DATE_TYPE_DATE)
                    {
                       throw new RuntimeException(
                          "Date function is in incorrect format: " +
                          "used SECOND modifier for DATE type");
                    }
                    workCal.add(Calendar.SECOND, iSign * iValue);
                    break;
                 }
                 default:
                 {
                    // Incorrect String
                    throw new RuntimeException(
                          "Date function is in incorrect format: "
                          + strValue + " at " + strValue.substring(iBeginIndex));
                 }
              }
              iBeginIndex++;
           }
           
           tsReturn = new Timestamp(workCal.getTimeInMillis());
           
        }
        else
        {
           try
           {
              if (stored)
              {
                 switch (iDateType)
                 {
                    case (DATE_TYPE_DATE) :
                    {
                       tsReturn = new Timestamp(DATE_STORE_FORMAT.parse(strValue).getTime());
                       break;   
                    }
                    case (DATE_TYPE_TIME) :
                    {
                       tsReturn = new Timestamp(TIME_STORE_FORMAT.parse(strValue).getTime());
                       break;   
                    }
                    case (DATE_TYPE_DATETIME) :
                    {
                       tsReturn = new Timestamp(DATETIME_STORE_FORMAT.parse(strValue).getTime());
                       break;   
                    }
                    default:
                    {
                       assert false : "Unknown date type " + iDateType;
                    }
                 }                  
              }
              else
              {
                 switch (iDateType)
                 {
                    case (DATE_TYPE_DATE) :
                    {
                       tsReturn = new Timestamp(DATE_FORMAT.parse(strValue).getTime());
                       break;   
                    }
                    case (DATE_TYPE_TIME) :
                    {
                       tsReturn = new Timestamp(TIME_FORMAT.parse(strValue).getTime());
                       break;   
                    }
                    case (DATE_TYPE_DATETIME) :
                    {
                       tsReturn = new Timestamp(DATETIME_FORMAT.parse(strValue).getTime());
                       break;   
                    }
                    default:
                    {
                       assert false : "Unknown date type " + iDateType;
                    }                  
                 }                  
              }
           }
           catch (ParseException peExc)
           {
              throw new RuntimeException(
                    "Date is in incorrect format. Problems with parsing.",
                    peExc);
           }
        }
     }
     return tsReturn;
  }
  
  /**
   * Parse the specified period into string displaying number of days the 
   * period represents. 
   * 
   * @param lPeriod - period in miliseconds
   * @return String - period in format "x day(s)" or "" if not valid period
   */
  public static String parseDayPeriod(
     long lPeriod
  )
  {
     StringBuffer sbReturn = new StringBuffer();
     long lDays = 0L;
     
     if (lPeriod > 0)
     {
        // we will count each started day as counted day 
        lPeriod = lPeriod + DateUtils.ONE_DAY - 1;
        
        lDays = lPeriod / DateUtils.ONE_DAY;
        sbReturn.append(lDays);
        if (lDays == 1L)
        {
           sbReturn.append(" day");
        }
        else
        {
           sbReturn.append(" days");
        }
     }
     else
     {
        sbReturn.append("0 days");
     }
     return sbReturn.toString();
  }
  
  /**
   * Parse the specified period into string displaying date and time the 
   * period represents. 
   * 
   * @param lPeriod - preiod in miliseconds
   * @return String - period in format "x day(s) y hour(s) z minute(s)" 
   *                  or "" if not valid period
   */
  public static String parseDayTimePeriod(
     long lPeriod
  )
  {
     StringBuffer sbReturn = new StringBuffer();
     long lHelp = 0L;
     
     
     if (lPeriod > 0)
     {
        lPeriod = lPeriod + DateUtils.ONE_MINUTE - 1;
        // we will count each started day as counted day 
        lHelp = lPeriod / DateUtils.ONE_DAY;
        if (lHelp > 0)
        {
           sbReturn.append(lHelp);
           if (lHelp == 1L)
           {
              sbReturn.append(" d ");
           }
           else
           {
              sbReturn.append(" d ");
           }
        }
        lPeriod = lPeriod % DateUtils.ONE_DAY;
        lHelp = lPeriod / DateUtils.ONE_HOUR;
        if (lHelp > 0 || sbReturn.length() > 0)
        {
           sbReturn.append(lHelp);
           if (lHelp == 1L)
           {
              sbReturn.append(" h ");
           }
           else
           {
              sbReturn.append(" h ");
           }
        }
        lPeriod = lPeriod % DateUtils.ONE_HOUR;
        lHelp = lPeriod / DateUtils.ONE_MINUTE;
        if (lHelp > 0 || sbReturn.length() > 0)
        {
           sbReturn.append(lHelp);
           if (lHelp == 1L)
           {
              sbReturn.append(" min");
           }
           else
           {
              sbReturn.append(" min");
           }
        }
     }
     else
     {
        sbReturn.append("0 min");
     }
     return sbReturn.toString();
  }
  

// TODO: For Miro: Remove this code once all the code which referred to these // was fixed. These should be moved to a GUI related class. // /** // * Method for list of timing types. // * // * @return List - list of timing types // */ // public static List getTimingTypes( // ) // { // List lstTimingTypes = new ArrayList(); // // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_MINUTES), // "Minute(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_HOURS), "Hour(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_DAYS), "Day(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_WEEKS), "Week(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_MONTHS), "Month(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_YEARS), "Year(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_NEVER), "Never")); // // return lstTimingTypes; // } // /** // * Method for list of timing types with None option. // * // * @return List - list of timing types // */ // public static List getTimingTypesWithNone( // ) // { // List lstTimingTypes = new ArrayList(); // // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_NONE), "None")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_MINUTES), // "Minute(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_HOURS), "Hour(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_DAYS), "Day(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_WEEKS), "Week(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_MONTHS), "Month(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_YEARS), "Year(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_NEVER), "Never")); // // return lstTimingTypes; // } // /** // * Method for getting string name of the timing type. // * // * @param iTimingType - timing type constant // * @return String - string name of timing type // */ // public static String getTimingTypeName( // int iTimingType // ) // { // String outTimingTypeName = "Never"; // switch (iTimingType) // { // case (DateUtils.TIMING_NEVER): // { // outTimingTypeName = "Never"; // break; // } // case (DateUtils.TIMING_MINUTES): // { // outTimingTypeName = "Minute(s)"; // break; // } // case (DateUtils.TIMING_HOURS): // { // outTimingTypeName = "Hour(s)"; // break; // } // case (DateUtils.TIMING_DAYS): // { // outTimingTypeName = "Day(s)"; // break; // } // case (DateUtils.TIMING_WEEKS): // { // outTimingTypeName = "Week(s)"; // break; // } // case (DateUtils.TIMING_MONTHS): // { // outTimingTypeName = "Month(s)"; // break; // } // case (DateUtils.TIMING_YEARS): // { // outTimingTypeName = "Year(s)"; // break; // } // case (DateUtils.TIMING_NONE): // { // outTimingTypeName = "None"; // break; // } // } // // return outTimingTypeName; // }

  /**
   * Get expiration timestamp from start date, period type and duration. For 
   * example if the start date is now, period type is hour and duration is 2
   * then the result will be timestamp representing now + 2 hours.  
   * 
   * @param tsStartDate - start date of period counting
   * @param iPeriodType - one of the period type constant TIMING_XXX 
   * @param iPeriodDuration - period duration, number of time units specified 
   *                          by period type
   * @return Timestamp - date of period expiration or null if any problem
   */
  public static Timestamp getPeriodExpiration(
     Timestamp tsStartDate,
     int       iPeriodType,
     int       iPeriodDuration
  )
  {
     Timestamp tsReturn = null;
     Calendar calHelp;
     if (tsStartDate != null && iPeriodDuration > 0 
           && iPeriodType > TIMING_NEVER && iPeriodType < TIMING_NONE)
     {
        calHelp = Calendar.getInstance();
        calHelp.setTime(tsStartDate);
        
        switch (iPeriodType)
        {
           case (TIMING_MINUTES) :
           {
              calHelp.add(Calendar.MINUTE, iPeriodDuration);
              break;
           }
           case (TIMING_HOURS) :
           {
              calHelp.add(Calendar.HOUR, iPeriodDuration);
              break;
           }
           case (TIMING_DAYS) :
           {
              calHelp.add(Calendar.DATE, iPeriodDuration);
              break;
           }
           case (TIMING_WEEKS) :
           {
              calHelp.add(Calendar.WEEK_OF_YEAR, iPeriodDuration);
              break;
           }
           case (TIMING_MONTHS) :
           {
              calHelp.add(Calendar.MONTH, iPeriodDuration);
              break;
           }
           case (TIMING_YEARS) :
           {
              calHelp.add(Calendar.YEAR, iPeriodDuration);
              break;
           }
           default :
           {
              assert false : "Not supported Timing type " + iPeriodType;
           } 
        }
        tsReturn = new Timestamp(calHelp.getTimeInMillis());
     }
     
     return tsReturn;
  }
  
  /**
   * Method to compare time periods
   * 
   * @param iPeriodType1 - first period type, one of the period type constant 
   *                       TIMING_XXX
   * @param iPeriodDuration1 - first period duration
   * @param iPeriodType2 - second period type, one of the period type constant 
   *                       TIMING_XXX
   * @param iPeriodDuration2 - second period duration
   * @return int - 1 - first period is longer
   *               0 - periods are same
   *              -1 - first period is shorter
   */
  public static int comparePeriods(
     int iPeriodType1,
     int iPeriodDuration1,
     int iPeriodType2,
     int iPeriodDuration2
  )
  {
     int iReturn = 0;
     
     if ((iPeriodType1 != TIMING_NEVER) && (iPeriodType1 != TIMING_NONE) 
        && (iPeriodType2 != TIMING_NEVER) && (iPeriodType2 != TIMING_NONE))
     {
        Timestamp tsTimestamp1 = getPeriodExpiration(
              new Timestamp(0), iPeriodType1, iPeriodDuration1);
        Timestamp tsTimestamp2 = getPeriodExpiration(
              new Timestamp(0), iPeriodType2, iPeriodDuration2);
        
        // TODO: Improve: When would any of these be null?
        if ((tsTimestamp1 != null) && (tsTimestamp2 != null))
        {
           if (tsTimestamp1.after(tsTimestamp2))
           {
              iReturn = 1;
           }
           else if (tsTimestamp2.after(tsTimestamp1))
           {
              iReturn = -1;
           }
        }
     }
     else
     {
        if (iPeriodType1 != iPeriodType2)
        {
           if (iPeriodType1 == TIMING_NEVER)
           {
              iReturn = 1;
           }
           else if (iPeriodType1 == TIMING_NONE)
           {
              iReturn = -1;
           }
           else if (iPeriodType2 == TIMING_NEVER)
           {
              iReturn = -1;
           }
           else if (iPeriodType2 == TIMING_NONE)
           {
              iReturn = 1;
           }
        }
     }
     return iReturn;      
  }
  
  /**
   * Convert timestamp to string including it"s nanosecond portion so that it 
   * can be safely stored in variable of web page.
   * 
   * @param tsTimestamp - timestamp to convert
   * @return String - text containing time and nanosecond portion of timestamp
   */
  public static String getTimestampAsString(
     Timestamp tsTimestamp
  )
  {
     StringBuffer sbTimestamp = new StringBuffer();
     
     sbTimestamp.append(tsTimestamp.getTime());
     sbTimestamp.append(NANO_SEPARATOR);
     sbTimestamp.append(tsTimestamp.getNanos());
     
     return sbTimestamp.toString();
  }
  
  /**
   * Function returns time string in the form MM:SS.MS from the input specified in miliseconds. 
   * 
   * @param lTimeInMiliseconds - time in miliseconds
   * @return String - string representation of miliseconds in the form MM:SS.MS
   */
  public static String getStringTime(
     long lTimeInMiliseconds
  )
  {
     long lTotalMS   = lTimeInMiliseconds;
     long lMS        = lTotalMS % 1000;
     long lTotalSecs = lTotalMS / 1000;
     long lSecs      = lTotalSecs % 60;
     long lTotalMins = lTotalSecs / 60;
     long lMinutes   = lTotalMins % 60;
     long lHours     = lTotalMins / 60;
     StringBuffer sbBuffer = new StringBuffer();
     if (lHours > 0)
     {
        sbBuffer.append(lHours);
        sbBuffer.append(":");
        sbBuffer.append(lMinutes);
        sbBuffer.append(":");
        sbBuffer.append(lSecs);
        sbBuffer.append(".");
        sbBuffer.append(lMS);
     }
     else if (lMinutes > 0)
     {
        sbBuffer.append(lMinutes);
        sbBuffer.append(":");
        sbBuffer.append(lSecs);
        sbBuffer.append(".");
        sbBuffer.append(lMS);
     }
     else if (lSecs > 0)
     {
        sbBuffer.append(lSecs);
        sbBuffer.append(".");
        sbBuffer.append(lMS);
        sbBuffer.append(" seconds");
     }
     else
     {
        sbBuffer.append(lMS);
        sbBuffer.append(" ms");
     }
     
     return sbBuffer.toString();
  }

// TODO: For Miro: Remove this code once all the code which referred to these // was fixed. These should be moved to a GUI or business logic related class. // /** // * Method to check if valid period settings // * // * @param iPeriod - period length // * @param iPeriodType - period type // * @param iPeriodStartType - period start type // * @param iAttributeId - attribute ID for dynamic period start type // * @param bPeriodException - period exception flag // * @param strPeriodName - period name used for exception message // * @param bAdvancePeriodType - flag if advanced period type (includes also start type) // * @param bfideException - invalid data exception // */ // public static void validatePeriod( // int iPeriod, // int iPeriodType, // int iPeriodStartType, // int iAttributeId, // boolean bPeriodException, // String strPeriodName, // boolean bAdvancePeriodType, // OSSInvalidDataException messageException // ) // { // if ((iPeriod > 0) // || ((iPeriodType != TIMING_NONE) && (iPeriodType != TIMING_NEVER)) // || (bPeriodException) || (iPeriodStartType != PERIOD_START_TYPE_NONE)) // { // if (iPeriod <= 0) // { // if (messageException == null) // { // messageException = new OSSInvalidDataException(); // } // messageException.getErrorMessages().addMessage( // PERIOD_TYPE_OBJ, // "You have to set valid period length for " + strPeriodName + " type." // ); // } // else if ((iPeriodType == TIMING_NONE) || (iPeriodType == TIMING_NEVER)) // { // if (messageException == null) // { // messageException = new OSSInvalidDataException(); // } // messageException.getErrorMessages().addMessage( // PERIOD_TYPE_OBJ, // "You have to set valid period type for " + strPeriodName + " type." // ); // } // else if ((bAdvancePeriodType) && (iPeriodStartType == PERIOD_START_TYPE_NONE)) // { // if (messageException == null) // { // messageException = new OSSInvalidDataException(); // } // messageException.getErrorMessages().addMessage( // PERIOD_TYPE_OBJ, // "You have to set valid period start type for " + strPeriodName + " type." // ); // } // else if ((bAdvancePeriodType) // && (iPeriodStartType == PERIOD_START_TYPE_DYNAMIC) // && (iAttributeId == DataObject.NEW_ID)) // { // if (messageException == null) // { // messageException = new OSSInvalidDataException(); // } // messageException.getErrorMessages().addMessage( // PERIOD_TYPE_OBJ, // "You have to set valid period dynamic start attribute for " // + strPeriodName + " type." // ); // } // } // } }


 </source>
   
  
 
  



Timestamp parse

   <source lang="java">
 

/**

* Copyright (c) 2003 - 2007 OpenSubsystems s.r.o. Slovak Republic. All rights reserved.
* 
* Project: OpenSubsystems
* 
* $Id: DateUtils.java,v 1.7 2007/01/07 06:14:00 bastafidli Exp $
* 
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License. 
* 
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
* 
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
*/

import java.sql.Timestamp; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar;

/**

* Collection of useful utilities to work with dates. 
* 
* @version $Id: DateUtils.java,v 1.7 2007/01/07 06:14:00 bastafidli Exp $
* @author Miro Halas
* @code.reviewer Miro Halas
* @code.reviewed 1.5 2005/09/13 13:23:15 bastafidli
*/

public final class DateUtils {

  // Constants ////////////////////////////////////////////////////////////////
  
  /**
   * One second in milliseconds.
   */
  public static final long ONE_SECOND = 1000L;
  
  /**
   * One minute in milliseconds.
   */
  public static final long ONE_MINUTE = ONE_SECOND * 60L;
  
  /**
   * One hour in milliseconds.
   */
  public static final long ONE_HOUR = ONE_MINUTE * 60L;
  
  /**
   * One day in milliseconds.
   */
  public static final long ONE_DAY = ONE_HOUR * 24L;
  
  /**
   * Separator we used to separate time from the nanosecond portion of the 
   * timestamp when converted to string.
   */
  public static final char NANO_SEPARATOR = ":";
  
  /**
   * Constant for timing type
   */
  public static final int TIMING_NEVER = 0;
  /**
   * Constant for timing type
   */
  public static final int TIMING_MINUTES = 1;
  /**
   * Constant for timing type
   */
  public static final int TIMING_HOURS = 2;
  /**
   * Constant for timing type
   */
  public static final int TIMING_DAYS = 3;
  /**
   * Constant for timing type
   */
  public static final int TIMING_WEEKS = 4;
  /**
   * Constant for timing type
   */
  public static final int TIMING_MONTHS = 5;
  /**
   * Constant for timing type
   */
  public static final int TIMING_YEARS = 6;
  
  /**
   * Constant for timing type
   */
  public static final int TIMING_NONE = 7;
  /**
   * Constant for current date code used in date/time formulas 
   */
  public static final String CURRENT_DATE_CODE = "now";
  
  /**
   * Constant for dynamic date code used in date/time formulas
   */
  public static final char YEAR_CODE = "y";
  
  /**
   * Constant for dynamic date code used in date/time formulas
   */
  public static final char MONTH_CODE = "M";
  /**
   * Constant for dynamic date code used in date/time formulas
   */
  public static final char WEEK_CODE = "w";
  /**
   * Constant for dynamic date code used in date/time formulas
   */
  public static final char DAY_CODE = "d";
  /**
   * Constant for dynamic date code used in date/time formulas
   */
  public static final char HOUR_CODE = "h";
  /**
   * Constant for dynamic date code used in date/time formulas
   */
  public static final char MINUTE_CODE = "m";
  
  /**
   * Constant for dynamic date code used in date/time formulas
   */
  public static final char SECOND_CODE = "s";
  /**
   * constant for date type DATE
   */
  public static final int DATE_TYPE_DATE = 1;
  /**
   * constant for date type TIME
   */
  public static final int DATE_TYPE_TIME = 2;
  /**
   * constant for date type DATETIME
   */
  public static final int DATE_TYPE_DATETIME = 3;
  
  // Constants for period start types /////////////////////////////////////////

// TODO: For Miro: Remove this code once all the code which referred to these // constants was fixed // /** // * constant for period type // */ // public static final int PERIOD_START_TYPE_NONE = 0; // // /** // * constant for period type // */ // public static final int PERIOD_START_TYPE_CREATION = 1; // // /** // * constant for period type // */ // public static final int PERIOD_START_TYPE_COMPLETION = 2; // // /** // * constant for period type // */ // public static final int PERIOD_START_TYPE_APPROVAL = 3; // // /** // * constant for period type // */ // public static final int PERIOD_START_TYPE_ACTIVATION = 4; // // /** // * constant for period type // */ // public static final int PERIOD_START_TYPE_INACTIVATION = 5; // // /** // * constant for period type // */ // public static final int PERIOD_START_TYPE_DYNAMIC = 6; // // /** // * constant for period type code // */ // public static final int PERIOD_TYPE_CODE = 99; // // /** // * constant for period type object // */ // public static final Integer PERIOD_TYPE_OBJ = new Integer(PERIOD_TYPE_CODE);

  // Cached variables /////////////////////////////////////////////////////////
  
  /**
   * static SimpleDateFormat for date format to display on UI and in messages.
   */
  public static final SimpleDateFormat DATE_FORMAT 
                         = (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.SHORT);
  
  /**
   * static SimpleDateFormat for time format to display on UI and in messages.
   */
  public static final SimpleDateFormat TIME_FORMAT 
                         = (SimpleDateFormat) DateFormat.getTimeInstance(DateFormat.MEDIUM);
  
  /**
   * static SimpleDateFormat for datetime format to display on UI and in messages.
   */
  public static final SimpleDateFormat DATETIME_FORMAT 
                         = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.SHORT, 
                                                          DateFormat.MEDIUM); 
  /**
   * static SimpleDateFormat for date format to store date as string so that
   * it is stored consistently.
   */
  public static final SimpleDateFormat DATE_STORE_FORMAT
                         = new SimpleDateFormat("MM/dd/yyyy");
  
  /**
   * static SimpleDateFormat for time format to store time as string so that
   * it is stored consistently.
   */
  public static final SimpleDateFormat TIME_STORE_FORMAT 
                         = new SimpleDateFormat("HH:mm:ss");
  
  /**
   * static SimpleDateFormat for datetime format to store date and time as 
   * string so that it is stored consistently.
   */
  public static final SimpleDateFormat DATETIME_STORE_FORMAT 
                         = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
  /**
   * static SimpleDateFormat for date format for sql date
   */
  public static final SimpleDateFormat DATE_SQL_FORMAT
                         = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
  
  /**
   * static SimpleDateFormat for time format for sql time
   */
  public static final SimpleDateFormat TIME_SQL_FORMAT 
                         = new SimpleDateFormat("1970-01-01 HH:mm:ss");
  
  /**
   * static SimpleDateFormat for datetime format for sql date and time
   */
  public static final SimpleDateFormat DATETIME_SQL_FORMAT 
                         = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  // Constructors /////////////////////////////////////////////////////////////
  
  /** 
   * Private constructor since this class cannot be instantiated
   */
  private DateUtils(
  )
  {
     // Do nothing
  }
  
  // Public methods ///////////////////////////////////////////////////////////
  
  /**
   * Check if two dates equals regardless of the time. Two null dates are equal. 
   * Null and not null dates are not equal.
   * 
   * @param  dtFirst - first date to compare, can be null
   * @param  dtSecond - second date to compare, can be null 
   * @return boolean - true if two dates equals regardless of what the time is 
   */
  public static boolean dateEquals(
     Date dtFirst,
     Date dtSecond
  )
  {
     boolean  bReturn = false;
     
     // If they are the same object, they are equals
     bReturn = (dtFirst == dtSecond);
     if (!bReturn)
     {
        if (dtFirst == null)
        {
           // Two null dates are the same
           bReturn = (dtSecond == null);
        }
        else
        {
           if (dtSecond != null)
           {
              Calendar compCalendar;
              int      iEra;
              int      iYear;
              int      iMonth;
              int      iDay;
              
              compCalendar = Calendar.getInstance();
              compCalendar.setTime(dtFirst);
              iEra   = compCalendar.get(Calendar.ERA);
              iYear  = compCalendar.get(Calendar.YEAR);
              iMonth = compCalendar.get(Calendar.MONTH);
              iDay   = compCalendar.get(Calendar.DATE);
              compCalendar.setTime(dtSecond);
        
              bReturn = ((iEra == compCalendar.get(Calendar.ERA))
                        && (iYear == compCalendar.get(Calendar.YEAR))
                        && (iMonth == compCalendar.get(Calendar.MONTH))
                        && (iDay == compCalendar.get(Calendar.DATE)));
           }
        }
     } 
           
     return bReturn;            
  }
  
  /**
   * Check if two times equals regardless of the date. Two null times are equal. 
   * Null and not null times are not equal.
   * 
   * @param  dtFirst - first time to compare, can be null
   * @param  dtSecond - second time to compare, can be null
   * @param  bIgnoreMilliseconds - if true milliseconds will be ignored in comparison
   * @return boolean - true if two time equals regardless of what the date is 
   */
  public static boolean timeEquals(
     Date    dtFirst,
     Date    dtSecond,
     boolean bIgnoreMilliseconds
  )
  {
     boolean  bReturn = false;
     
     // If they are the same object, they are equals
     bReturn = (dtFirst == dtSecond);
     if (!bReturn)
     {
        if (dtFirst == null)
        {
           // Two null dates are the same
           bReturn = (dtSecond == null);
        }
        else
        {
           if (dtSecond != null)
           {
              Calendar compCalendar;
              int      iHour;
              int      iMinute;
              int      iSecond;
              int      iMili;
              
              compCalendar = Calendar.getInstance();
              compCalendar.setTime(dtFirst);
              iHour   = compCalendar.get(Calendar.HOUR_OF_DAY);
              iMinute = compCalendar.get(Calendar.MINUTE);
              iSecond = compCalendar.get(Calendar.SECOND);
              iMili   = compCalendar.get(Calendar.MILLISECOND);
              compCalendar.setTime(dtSecond);
        
              bReturn = ((iHour == compCalendar.get(Calendar.HOUR_OF_DAY))
                        && (iMinute == compCalendar.get(Calendar.MINUTE))
                        && (iSecond == compCalendar.get(Calendar.SECOND))
                        && ((bIgnoreMilliseconds) 
                           || (iMili == compCalendar.get(Calendar.MILLISECOND))));
           }
        }
     } 
           
     return bReturn;            
  }
  /**
   * Check if two dates and times are equal. Two null dates are equal. Null 
   * and not null dates are not equal.
   * 
   * @param  dtFirst - first date time to compare, can be null
   * @param  dtSecond - second date time to compare, can be null
   * @return boolean - true if two date and times are equal 
   */
  public static boolean dateAndTimeEquals(
     Date dtFirst,
     Date dtSecond
  )
  {
     boolean bReturn = false;
     
     // If they are the same object, they are equals
     bReturn = (dtFirst == dtSecond);
     if (!bReturn)
     {
        if (dtFirst == null)
        {
           // Two null dates are the same
           bReturn = (dtSecond == null);
        }
        else
        {
           if (dtSecond != null)
           {
              // They are both not null so they have to match to millisecond
              // (actually to nanosecond since the getTime takes nanoseconds
              // into account)
              bReturn = (dtFirst.getTime() == dtSecond.getTime());                               
           }
        }
     }
           
     return bReturn;            
  }
  /**
   * Check if String representing date is function or date. Date is a function
   * (formula) if it starts with the current date/time variable which can be 
   * followed by expression describing period from current date.
   *
   * @param strValue - string representation of date or date function
   * @return boolean - date function flag
   */
  public static boolean isFunction(
     String   strValue
  )
  {
     boolean bReturn = false;
     if ((strValue != null) && (strValue.length() > 0) 
        && (strValue.trim().startsWith(CURRENT_DATE_CODE)))
     {
        bReturn = true;
     }
     
     return bReturn;
  }
  
  /**
   * Parse date time value from given string resolving any functions or formulas
   * the string can contain. This method  can be therefore used if the passed 
   * string contains string representation date, time or timestamp or a formula
   * such as now + 3h - 1m + 4d. 
   *
   * @param strValue - string representation of date or date function
   * @param iDateType - date type code, one of the DATE_TYPE_XXX constants
   * @param stored - flag if Date should be parsed using format used for 
   *                 storage or for display
   * @return Timestamp - parsed date or null if date was null
   * @throws OSSInvalidDataException - error during parsing
   */
  public static Timestamp parseDateTime(
     String   strValue,
     int      iDateType,
     boolean  stored
  )
  {
     Timestamp tsReturn = null;
     Calendar workCal = GregorianCalendar.getInstance();
     
     if (strValue != null && strValue.length() > 0)
     {
        strValue = strValue.trim();
        if (strValue.startsWith(CURRENT_DATE_CODE))
        {
           strValue = strValue.replaceAll("[ ]", "");
           // If the user specified "UseCurrent", then substitute the
           // current date/time in the value
           workCal.setTime(new Date());

// Log.getInstance().debug("Parsing current date " + strValue);

           // Parse the date math
           int iBeginIndex = CURRENT_DATE_CODE.length();
           int iMaxLength = strValue.length();
           int iSign = 1;
           int iNumberIndex;
           int iValue;
           char cChar = " ";
           while (iBeginIndex < iMaxLength)
           {
              // This has to be sign
              if (strValue.charAt(iBeginIndex) == "+")
              {
                 iSign = 1;
              }
              else if (strValue.charAt(iBeginIndex) == "-")
              {
                 iSign = -1;
              }
              else
              {
                 // Incorrect String
                 throw new RuntimeException(
                          "Date function is in incorrect format: "
                          + strValue + " at " + strValue.substring(iBeginIndex));
              }
              iBeginIndex++;
              // Now we have to have number
              iNumberIndex = iBeginIndex;
              
              while (((iBeginIndex == iNumberIndex) || Character.isDigit(cChar)) 
                    && (iBeginIndex < iMaxLength))
              {
                 cChar = strValue.charAt(iBeginIndex++);
              }
              // We have to go one back because we should stop on modifier (e.g 1m)
              iBeginIndex--;
              try
              {
                 iValue = Integer.parseInt(strValue.substring(iNumberIndex, iBeginIndex));
              }
              catch (NumberFormatException nmeExc)
              {
                 // Incorrect String
                 throw new RuntimeException(
                          "Date function is in incorrect format: "
                          + strValue + " at " + strValue.substring(iNumberIndex));
              }
              // This has to be modifier: y - year, M - month, w - week, 
              // d - day, h - hour, m - minute, s - second
              cChar = strValue.charAt(iBeginIndex);
              switch(cChar)
              {
                 case(YEAR_CODE):
                 {
                    if (iDateType == DATE_TYPE_TIME)
                    {
                       throw new RuntimeException(
                          "Date function is in incorrect format: " +
                          "used YEAR modifier for TIME type");
                    }
                    workCal.add(Calendar.YEAR, iSign * iValue);
                    break;
                 }
                 case(MONTH_CODE):
                 {
                    if (iDateType == DATE_TYPE_TIME)
                    {
                       throw new RuntimeException(
                          "Date function is in incorrect format: " +
                          "used MONTH modifier for TIME type");
                    }
                    workCal.add(Calendar.MONTH, iSign * iValue);
                    break;
                 }
                 case(WEEK_CODE):
                 {
                    if (iDateType == DATE_TYPE_TIME)
                    {
                       throw new RuntimeException(
                          "Date function is in incorrect format: " +
                          "used WEEK modifier for TIME type");
                    }
                    workCal.add(Calendar.WEEK_OF_YEAR, iSign * iValue);
                    break;
                 }
                 case(DAY_CODE):
                 {
                    if (iDateType == DATE_TYPE_TIME)
                    {
                       throw new RuntimeException(
                          "Date function is in incorrect format: " +
                          "used DAY modifier for TIME type");
                    }
                    workCal.add(Calendar.DATE, iSign * iValue);
                    break;
                 }
                 case(HOUR_CODE):
                 {
                    if (iDateType == DATE_TYPE_DATE)
                    {
                       throw new RuntimeException(
                          "Date function is in incorrect format: " +
                          "used HOUR modifier for DATE type");
                    }
                    workCal.add(Calendar.HOUR, iSign * iValue);
                    break;
                 }
                 case(MINUTE_CODE):
                 {
                    if (iDateType == DATE_TYPE_DATE)
                    {
                       throw new RuntimeException(
                          "Date function is in incorrect format: " +
                          "used MINUTE modifier for DATE type");
                    }
                    workCal.add(Calendar.MINUTE, iSign * iValue);
                    break;
                 }
                 case(SECOND_CODE):
                 {
                    if (iDateType == DATE_TYPE_DATE)
                    {
                       throw new RuntimeException(
                          "Date function is in incorrect format: " +
                          "used SECOND modifier for DATE type");
                    }
                    workCal.add(Calendar.SECOND, iSign * iValue);
                    break;
                 }
                 default:
                 {
                    // Incorrect String
                    throw new RuntimeException(
                          "Date function is in incorrect format: "
                          + strValue + " at " + strValue.substring(iBeginIndex));
                 }
              }
              iBeginIndex++;
           }
           
           tsReturn = new Timestamp(workCal.getTimeInMillis());
           
        }
        else
        {
           try
           {
              if (stored)
              {
                 switch (iDateType)
                 {
                    case (DATE_TYPE_DATE) :
                    {
                       tsReturn = new Timestamp(DATE_STORE_FORMAT.parse(strValue).getTime());
                       break;   
                    }
                    case (DATE_TYPE_TIME) :
                    {
                       tsReturn = new Timestamp(TIME_STORE_FORMAT.parse(strValue).getTime());
                       break;   
                    }
                    case (DATE_TYPE_DATETIME) :
                    {
                       tsReturn = new Timestamp(DATETIME_STORE_FORMAT.parse(strValue).getTime());
                       break;   
                    }
                    default:
                    {
                       assert false : "Unknown date type " + iDateType;
                    }
                 }                  
              }
              else
              {
                 switch (iDateType)
                 {
                    case (DATE_TYPE_DATE) :
                    {
                       tsReturn = new Timestamp(DATE_FORMAT.parse(strValue).getTime());
                       break;   
                    }
                    case (DATE_TYPE_TIME) :
                    {
                       tsReturn = new Timestamp(TIME_FORMAT.parse(strValue).getTime());
                       break;   
                    }
                    case (DATE_TYPE_DATETIME) :
                    {
                       tsReturn = new Timestamp(DATETIME_FORMAT.parse(strValue).getTime());
                       break;   
                    }
                    default:
                    {
                       assert false : "Unknown date type " + iDateType;
                    }                  
                 }                  
              }
           }
           catch (ParseException peExc)
           {
              throw new RuntimeException(
                    "Date is in incorrect format. Problems with parsing.",
                    peExc);
           }
        }
     }
     return tsReturn;
  }
  
  /**
   * Parse the specified period into string displaying number of days the 
   * period represents. 
   * 
   * @param lPeriod - period in miliseconds
   * @return String - period in format "x day(s)" or "" if not valid period
   */
  public static String parseDayPeriod(
     long lPeriod
  )
  {
     StringBuffer sbReturn = new StringBuffer();
     long lDays = 0L;
     
     if (lPeriod > 0)
     {
        // we will count each started day as counted day 
        lPeriod = lPeriod + DateUtils.ONE_DAY - 1;
        
        lDays = lPeriod / DateUtils.ONE_DAY;
        sbReturn.append(lDays);
        if (lDays == 1L)
        {
           sbReturn.append(" day");
        }
        else
        {
           sbReturn.append(" days");
        }
     }
     else
     {
        sbReturn.append("0 days");
     }
     return sbReturn.toString();
  }
  
  /**
   * Parse the specified period into string displaying date and time the 
   * period represents. 
   * 
   * @param lPeriod - preiod in miliseconds
   * @return String - period in format "x day(s) y hour(s) z minute(s)" 
   *                  or "" if not valid period
   */
  public static String parseDayTimePeriod(
     long lPeriod
  )
  {
     StringBuffer sbReturn = new StringBuffer();
     long lHelp = 0L;
     
     
     if (lPeriod > 0)
     {
        lPeriod = lPeriod + DateUtils.ONE_MINUTE - 1;
        // we will count each started day as counted day 
        lHelp = lPeriod / DateUtils.ONE_DAY;
        if (lHelp > 0)
        {
           sbReturn.append(lHelp);
           if (lHelp == 1L)
           {
              sbReturn.append(" d ");
           }
           else
           {
              sbReturn.append(" d ");
           }
        }
        lPeriod = lPeriod % DateUtils.ONE_DAY;
        lHelp = lPeriod / DateUtils.ONE_HOUR;
        if (lHelp > 0 || sbReturn.length() > 0)
        {
           sbReturn.append(lHelp);
           if (lHelp == 1L)
           {
              sbReturn.append(" h ");
           }
           else
           {
              sbReturn.append(" h ");
           }
        }
        lPeriod = lPeriod % DateUtils.ONE_HOUR;
        lHelp = lPeriod / DateUtils.ONE_MINUTE;
        if (lHelp > 0 || sbReturn.length() > 0)
        {
           sbReturn.append(lHelp);
           if (lHelp == 1L)
           {
              sbReturn.append(" min");
           }
           else
           {
              sbReturn.append(" min");
           }
        }
     }
     else
     {
        sbReturn.append("0 min");
     }
     return sbReturn.toString();
  }
  

// TODO: For Miro: Remove this code once all the code which referred to these // was fixed. These should be moved to a GUI related class. // /** // * Method for list of timing types. // * // * @return List - list of timing types // */ // public static List getTimingTypes( // ) // { // List lstTimingTypes = new ArrayList(); // // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_MINUTES), // "Minute(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_HOURS), "Hour(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_DAYS), "Day(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_WEEKS), "Week(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_MONTHS), "Month(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_YEARS), "Year(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_NEVER), "Never")); // // return lstTimingTypes; // } // /** // * Method for list of timing types with None option. // * // * @return List - list of timing types // */ // public static List getTimingTypesWithNone( // ) // { // List lstTimingTypes = new ArrayList(); // // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_NONE), "None")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_MINUTES), // "Minute(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_HOURS), "Hour(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_DAYS), "Day(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_WEEKS), "Week(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_MONTHS), "Month(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_YEARS), "Year(s)")); // lstTimingTypes.add(new SelectOption(Integer.toString(DateUtils.TIMING_NEVER), "Never")); // // return lstTimingTypes; // } // /** // * Method for getting string name of the timing type. // * // * @param iTimingType - timing type constant // * @return String - string name of timing type // */ // public static String getTimingTypeName( // int iTimingType // ) // { // String outTimingTypeName = "Never"; // switch (iTimingType) // { // case (DateUtils.TIMING_NEVER): // { // outTimingTypeName = "Never"; // break; // } // case (DateUtils.TIMING_MINUTES): // { // outTimingTypeName = "Minute(s)"; // break; // } // case (DateUtils.TIMING_HOURS): // { // outTimingTypeName = "Hour(s)"; // break; // } // case (DateUtils.TIMING_DAYS): // { // outTimingTypeName = "Day(s)"; // break; // } // case (DateUtils.TIMING_WEEKS): // { // outTimingTypeName = "Week(s)"; // break; // } // case (DateUtils.TIMING_MONTHS): // { // outTimingTypeName = "Month(s)"; // break; // } // case (DateUtils.TIMING_YEARS): // { // outTimingTypeName = "Year(s)"; // break; // } // case (DateUtils.TIMING_NONE): // { // outTimingTypeName = "None"; // break; // } // } // // return outTimingTypeName; // }

  /**
   * Get expiration timestamp from start date, period type and duration. For 
   * example if the start date is now, period type is hour and duration is 2
   * then the result will be timestamp representing now + 2 hours.  
   * 
   * @param tsStartDate - start date of period counting
   * @param iPeriodType - one of the period type constant TIMING_XXX 
   * @param iPeriodDuration - period duration, number of time units specified 
   *                          by period type
   * @return Timestamp - date of period expiration or null if any problem
   */
  public static Timestamp getPeriodExpiration(
     Timestamp tsStartDate,
     int       iPeriodType,
     int       iPeriodDuration
  )
  {
     Timestamp tsReturn = null;
     Calendar calHelp;
     if (tsStartDate != null && iPeriodDuration > 0 
           && iPeriodType > TIMING_NEVER && iPeriodType < TIMING_NONE)
     {
        calHelp = Calendar.getInstance();
        calHelp.setTime(tsStartDate);
        
        switch (iPeriodType)
        {
           case (TIMING_MINUTES) :
           {
              calHelp.add(Calendar.MINUTE, iPeriodDuration);
              break;
           }
           case (TIMING_HOURS) :
           {
              calHelp.add(Calendar.HOUR, iPeriodDuration);
              break;
           }
           case (TIMING_DAYS) :
           {
              calHelp.add(Calendar.DATE, iPeriodDuration);
              break;
           }
           case (TIMING_WEEKS) :
           {
              calHelp.add(Calendar.WEEK_OF_YEAR, iPeriodDuration);
              break;
           }
           case (TIMING_MONTHS) :
           {
              calHelp.add(Calendar.MONTH, iPeriodDuration);
              break;
           }
           case (TIMING_YEARS) :
           {
              calHelp.add(Calendar.YEAR, iPeriodDuration);
              break;
           }
           default :
           {
              assert false : "Not supported Timing type " + iPeriodType;
           } 
        }
        tsReturn = new Timestamp(calHelp.getTimeInMillis());
     }
     
     return tsReturn;
  }
  
  /**
   * Method to compare time periods
   * 
   * @param iPeriodType1 - first period type, one of the period type constant 
   *                       TIMING_XXX
   * @param iPeriodDuration1 - first period duration
   * @param iPeriodType2 - second period type, one of the period type constant 
   *                       TIMING_XXX
   * @param iPeriodDuration2 - second period duration
   * @return int - 1 - first period is longer
   *               0 - periods are same
   *              -1 - first period is shorter
   */
  public static int comparePeriods(
     int iPeriodType1,
     int iPeriodDuration1,
     int iPeriodType2,
     int iPeriodDuration2
  )
  {
     int iReturn = 0;
     
     if ((iPeriodType1 != TIMING_NEVER) && (iPeriodType1 != TIMING_NONE) 
        && (iPeriodType2 != TIMING_NEVER) && (iPeriodType2 != TIMING_NONE))
     {
        Timestamp tsTimestamp1 = getPeriodExpiration(
              new Timestamp(0), iPeriodType1, iPeriodDuration1);
        Timestamp tsTimestamp2 = getPeriodExpiration(
              new Timestamp(0), iPeriodType2, iPeriodDuration2);
        
        // TODO: Improve: When would any of these be null?
        if ((tsTimestamp1 != null) && (tsTimestamp2 != null))
        {
           if (tsTimestamp1.after(tsTimestamp2))
           {
              iReturn = 1;
           }
           else if (tsTimestamp2.after(tsTimestamp1))
           {
              iReturn = -1;
           }
        }
     }
     else
     {
        if (iPeriodType1 != iPeriodType2)
        {
           if (iPeriodType1 == TIMING_NEVER)
           {
              iReturn = 1;
           }
           else if (iPeriodType1 == TIMING_NONE)
           {
              iReturn = -1;
           }
           else if (iPeriodType2 == TIMING_NEVER)
           {
              iReturn = -1;
           }
           else if (iPeriodType2 == TIMING_NONE)
           {
              iReturn = 1;
           }
        }
     }
     return iReturn;      
  }
  
  /**
   * Convert timestamp to string including it"s nanosecond portion so that it 
   * can be safely stored in variable of web page.
   * 
   * @param tsTimestamp - timestamp to convert
   * @return String - text containing time and nanosecond portion of timestamp
   */
  public static String getTimestampAsString(
     Timestamp tsTimestamp
  )
  {
     StringBuffer sbTimestamp = new StringBuffer();
     
     sbTimestamp.append(tsTimestamp.getTime());
     sbTimestamp.append(NANO_SEPARATOR);
     sbTimestamp.append(tsTimestamp.getNanos());
     
     return sbTimestamp.toString();
  }
  
  /**
   * Function returns time string in the form MM:SS.MS from the input specified in miliseconds. 
   * 
   * @param lTimeInMiliseconds - time in miliseconds
   * @return String - string representation of miliseconds in the form MM:SS.MS
   */
  public static String getStringTime(
     long lTimeInMiliseconds
  )
  {
     long lTotalMS   = lTimeInMiliseconds;
     long lMS        = lTotalMS % 1000;
     long lTotalSecs = lTotalMS / 1000;
     long lSecs      = lTotalSecs % 60;
     long lTotalMins = lTotalSecs / 60;
     long lMinutes   = lTotalMins % 60;
     long lHours     = lTotalMins / 60;
     StringBuffer sbBuffer = new StringBuffer();
     if (lHours > 0)
     {
        sbBuffer.append(lHours);
        sbBuffer.append(":");
        sbBuffer.append(lMinutes);
        sbBuffer.append(":");
        sbBuffer.append(lSecs);
        sbBuffer.append(".");
        sbBuffer.append(lMS);
     }
     else if (lMinutes > 0)
     {
        sbBuffer.append(lMinutes);
        sbBuffer.append(":");
        sbBuffer.append(lSecs);
        sbBuffer.append(".");
        sbBuffer.append(lMS);
     }
     else if (lSecs > 0)
     {
        sbBuffer.append(lSecs);
        sbBuffer.append(".");
        sbBuffer.append(lMS);
        sbBuffer.append(" seconds");
     }
     else
     {
        sbBuffer.append(lMS);
        sbBuffer.append(" ms");
     }
     
     return sbBuffer.toString();
  }

// TODO: For Miro: Remove this code once all the code which referred to these // was fixed. These should be moved to a GUI or business logic related class. // /** // * Method to check if valid period settings // * // * @param iPeriod - period length // * @param iPeriodType - period type // * @param iPeriodStartType - period start type // * @param iAttributeId - attribute ID for dynamic period start type // * @param bPeriodException - period exception flag // * @param strPeriodName - period name used for exception message // * @param bAdvancePeriodType - flag if advanced period type (includes also start type) // * @param bfideException - invalid data exception // */ // public static void validatePeriod( // int iPeriod, // int iPeriodType, // int iPeriodStartType, // int iAttributeId, // boolean bPeriodException, // String strPeriodName, // boolean bAdvancePeriodType, // OSSInvalidDataException messageException // ) // { // if ((iPeriod > 0) // || ((iPeriodType != TIMING_NONE) && (iPeriodType != TIMING_NEVER)) // || (bPeriodException) || (iPeriodStartType != PERIOD_START_TYPE_NONE)) // { // if (iPeriod <= 0) // { // if (messageException == null) // { // messageException = new OSSInvalidDataException(); // } // messageException.getErrorMessages().addMessage( // PERIOD_TYPE_OBJ, // "You have to set valid period length for " + strPeriodName + " type." // ); // } // else if ((iPeriodType == TIMING_NONE) || (iPeriodType == TIMING_NEVER)) // { // if (messageException == null) // { // messageException = new OSSInvalidDataException(); // } // messageException.getErrorMessages().addMessage( // PERIOD_TYPE_OBJ, // "You have to set valid period type for " + strPeriodName + " type." // ); // } // else if ((bAdvancePeriodType) && (iPeriodStartType == PERIOD_START_TYPE_NONE)) // { // if (messageException == null) // { // messageException = new OSSInvalidDataException(); // } // messageException.getErrorMessages().addMessage( // PERIOD_TYPE_OBJ, // "You have to set valid period start type for " + strPeriodName + " type." // ); // } // else if ((bAdvancePeriodType) // && (iPeriodStartType == PERIOD_START_TYPE_DYNAMIC) // && (iAttributeId == DataObject.NEW_ID)) // { // if (messageException == null) // { // messageException = new OSSInvalidDataException(); // } // messageException.getErrorMessages().addMessage( // PERIOD_TYPE_OBJ, // "You have to set valid period dynamic start attribute for " // + strPeriodName + " type." // ); // } // } // } }


 </source>