通用日期處理函數

/*
 * <p>Company: 凌科軟件 www.elinksoft.com </p>
 * @author liubaojun
 * @version 1.0
 * Created on 2004-11-29
 * 來源於 elinkBSP (業務架構平臺) 部分源代碼
 */

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

public class DateUtil
{
 private static final int[] dayArray = new int[]
  { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
 private static SimpleDateFormat sdf = new SimpleDateFormat();

 public static synchronized Calendar getCalendar()
 {
  return GregorianCalendar.getInstance();
 }

 /**
  @return String
  */
 public static synchronized String getDateMilliFormat()
 {
  Calendar cal = Calendar.getInstance();
  return getDateMilliFormat( cal );
 }

 /**
  @param cal
  @return String
  */
 public static synchronized String getDateMilliFormat( java.util.Calendar cal )
 {
  String pattern = "yyyy-MM-dd HH:mm:ss,SSS";
  return getDateFormat( cal, pattern );
 }

 /**
  @param date
  @return String
  */
 public static synchronized String getDateMilliFormat( java.util.Date date )
 {
  String pattern = "yyyy-MM-dd HH:mm:ss,SSS";
  return getDateFormat( date, pattern );
 }

 /**
  @param strDate
  @return java.util.Calendar
  */
 public static synchronized Calendar parseCalendarMilliFormat( String strDate )
 {
  String pattern = "yyyy-MM-dd HH:mm:ss,SSS";
  return parseCalendarFormat( strDate, pattern );
 }

 /**
  @param strDate
  @return java.util.Date
  */
 public static synchronized Date parseDateMilliFormat( String strDate )
 {
  String pattern = "yyyy-MM-dd HH:mm:ss,SSS";
  return parseDateFormat( strDate, pattern );
 }

 /**
  @return String
  */
 public static synchronized String getDateSecondFormat()
 {
  Calendar cal = Calendar.getInstance();
  return getDateSecondFormat( cal );
 }

 /**
  @param cal
  @return String
  */
 public static synchronized String getDateSecondFormat( java.util.Calendar cal )
 {
  String pattern = "yyyy-MM-dd HH:mm:ss";
  return getDateFormat( cal, pattern );
 }

 /**
  @param date
  @return String
  */
 public static synchronized String getDateSecondFormat( java.util.Date date )
 {
  String pattern = "yyyy-MM-dd HH:mm:ss";
  return getDateFormat( date, pattern );
 }

 /**
  @param strDate
  @return java.util.Calendar
  */
 public static synchronized Calendar parseCalendarSecondFormat( String strDate )
 {
  String pattern = "yyyy-MM-dd HH:mm:ss";
  return parseCalendarFormat( strDate, pattern );
 }

 /**
  @param strDate
  @return java.util.Date
  */
 public static synchronized Date parseDateSecondFormat( String strDate )
 {
  String pattern = "yyyy-MM-dd HH:mm:ss";
  return parseDateFormat( strDate, pattern );
 }

 /**
  @return String
  */
 public static synchronized String getDateMinuteFormat()
 {
  Calendar cal = Calendar.getInstance();
  return getDateMinuteFormat( cal );
 }

 /**
  @param cal
  @return String
  */
 public static synchronized String getDateMinuteFormat( java.util.Calendar cal )
 {
  String pattern = "yyyy-MM-dd HH:mm";
  return getDateFormat( cal, pattern );
 }

 /**
  @param date
  @return String
  */
 public static synchronized String getDateMinuteFormat( java.util.Date date )
 {
  String pattern = "yyyy-MM-dd HH:mm";
  return getDateFormat( date, pattern );
 }

 /**
  @param strDate
  @return java.util.Calendar
  */
 public static synchronized Calendar parseCalendarMinuteFormat( String strDate )
 {
  String pattern = "yyyy-MM-dd HH:mm";
  return parseCalendarFormat( strDate, pattern );
 }

 /**
  @param strDate
  @return java.util.Date
  */
 public static synchronized Date parseDateMinuteFormat( String strDate )
 {
  String pattern = "yyyy-MM-dd HH:mm";
  return parseDateFormat( strDate, pattern );
 }

 /**
  @return String
  */
 public static synchronized String getDateDayFormat()
 {
  Calendar cal = Calendar.getInstance();
  return getDateDayFormat( cal );
 }

 /**
  @param cal
  @return String
  */
 public static synchronized String getDateDayFormat( java.util.Calendar cal )
 {
  String pattern = "yyyy-MM-dd";
  return getDateFormat( cal, pattern );
 }

 /**
  @param date
  @return String
  */
 public static synchronized String getDateDayFormat( java.util.Date date )
 {
  String pattern = "yyyy-MM-dd";
  return getDateFormat( date, pattern );
 }

 /**
  @param strDate
  @return java.util.Calendar
  */
 public static synchronized Calendar parseCalendarDayFormat( String strDate )
 {
  String pattern = "yyyy-MM-dd";
  return parseCalendarFormat( strDate, pattern );
 }

 /**
  @param strDate
  @return java.util.Date
  */
 public static synchronized Date parseDateDayFormat( String strDate )
 {
  String pattern = "yyyy-MM-dd";
  return parseDateFormat( strDate, pattern );
 }

 /**
  @return String
  */
 public static synchronized String getDateFileFormat()
 {
  Calendar cal = Calendar.getInstance();
  return getDateFileFormat( cal );
 }

 /**
  @param cal
  @return String
  */
 public static synchronized String getDateFileFormat( java.util.Calendar cal )
 {
  String pattern = "yyyy-MM-dd_HH-mm-ss";
  return getDateFormat( cal, pattern );
 }

 /**
  @param date
  @return String
  */
 public static synchronized String getDateFileFormat( java.util.Date date )
 {
  String pattern = "yyyy-MM-dd_HH-mm-ss";
  return getDateFormat( date, pattern );
 }

 /**
  @param strDate
  @return java.util.Calendar
  */
 public static synchronized Calendar parseCalendarFileFormat( String strDate )
 {
  String pattern = "yyyy-MM-dd_HH-mm-ss";
  return parseCalendarFormat( strDate, pattern );
 }

 /**
  @param strDate
  @return java.util.Date
  */
 public static synchronized Date parseDateFileFormat( String strDate )
 {
  String pattern = "yyyy-MM-dd_HH-mm-ss";
  return parseDateFormat( strDate, pattern );
 }

 /**
  @return String
  */
 public static synchronized String getDateW3CFormat()
 {
  Calendar cal = Calendar.getInstance();
  return getDateW3CFormat( cal );
 }

 /**
  @param cal
  @return String
  */
 public static synchronized String getDateW3CFormat( java.util.Calendar cal )
 {
  String pattern = "yyyy-MM-dd HH:mm:ss";
  return getDateFormat( cal, pattern );
 }

 /**
  @param date
  @return String
  */
 public static synchronized String getDateW3CFormat( java.util.Date date )
 {
  String pattern = "yyyy-MM-dd HH:mm:ss";
  return getDateFormat( date, pattern );
 }

 /**
  @param strDate
  @return java.util.Calendar
  */
 public static synchronized Calendar parseCalendarW3CFormat( String strDate )
 {
  String pattern = "yyyy-MM-dd HH:mm:ss";
  return parseCalendarFormat( strDate, pattern );
 }

 /**
  @param strDate
  @return java.util.Date
  */
 public static synchronized Date parseDateW3CFormat( String strDate )
 {
  String pattern = "yyyy-MM-dd HH:mm:ss";
  return parseDateFormat( strDate, pattern );
 }

 /**
  @param cal
  @return String
  */
 public static synchronized String getDateFormat( java.util.Calendar cal )
 {
  String pattern = "yyyy-MM-dd HH:mm:ss";
  return getDateFormat( cal, pattern );
 }

 /**
  @param date
  @return String
  */
 public static synchronized String getDateFormat( java.util.Date date )
 {
  String pattern = "yyyy-MM-dd HH:mm:ss";
  return getDateFormat( date, pattern );
 }

 /**
  @param strDate
  @return java.util.Calendar
  */
 public static synchronized Calendar parseCalendarFormat( String strDate )
 {
  String pattern = "yyyy-MM-dd HH:mm:ss";
  return parseCalendarFormat( strDate, pattern );
 }

 /**
  @param strDate
  @return java.util.Date
  */
 public static synchronized Date parseDateFormat( String strDate )
 {
  String pattern = "yyyy-MM-dd HH:mm:ss";
  return parseDateFormat( strDate, pattern );
 }

 /**
  @param cal
  @param pattern
  @return String
  */
 public static synchronized String getDateFormat( java.util.Calendar cal, String pattern )
 {
  return getDateFormat( cal.getTime(), pattern );
 }

 /**
  @param date
  @param pattern
  @return String
  */
 public static synchronized String getDateFormat( java.util.Date date, String pattern )
 {
  synchronized ( sdf )
  {
   String str = null;
   sdf.applyPattern( pattern );
   str = sdf.format( date );
   return str;
  }
 }

 /**
  @param strDate
  @param pattern
  @return java.util.Calendar
  */
 public static synchronized Calendar parseCalendarFormat( String strDate, String pattern )
 {
  synchronized ( sdf )
  {
   Calendar cal = null;
   sdf.applyPattern( pattern );
   try
   {
    sdf.parse( strDate );
    cal = sdf.getCalendar();
   }
   catch ( Exception e )
   {
   }
   return cal;
  }
 }

 /**
  @param strDate
  @param pattern
  @return java.util.Date
  */
 public static synchronized Date parseDateFormat( String strDate, String pattern )
 {
  synchronized ( sdf )
  {
   Date date = null;
   sdf.applyPattern( pattern );
   try
   {
    date = sdf.parse( strDate );
   }
   catch ( Exception e )
   {
   }
   return date;
  }
 }

 public static synchronized int getLastDayOfMonth( int month )
 {
  if ( month < 1 || month > 12 )
  {
   return -1;
  }
  int retn = 0;
  if ( month == 2 )
  {
   if ( isLeapYear() )
   {
    retn = 29;
   }
   else
   {
    retn = dayArray[month - 1];
   }
  }
  else
  {
   retn = dayArray[month - 1];
  }
  return retn;
 }

 public static synchronized int getLastDayOfMonth( int year, int month )
 {
  if ( month < 1 || month > 12 )
  {
   return -1;
  }
  int retn = 0;
  if ( month == 2 )
  {
   if ( isLeapYear( year ) )
   {
    retn = 29;
   }
   else
   {
    retn = dayArray[month - 1];
   }
  }
  else
  {
   retn = dayArray[month - 1];
  }
  return retn;
 }

 public static synchronized boolean isLeapYear()
 {
  Calendar cal = Calendar.getInstance();
  int year = cal.get( Calendar.YEAR );
  return isLeapYear( year );
 }

 public static synchronized boolean isLeapYear( int year )
 {
  /**
   * 詳細設計: 1.被400整除是閏年,否則: 2.不能被4整除則不是閏年 3.能被4整除同時不能被100整除則是閏年
   * 3.能被4整除同時能被100整除則不是閏年
   */
  if ( ( year % 400 ) == 0 )
   return true;
  else if ( ( year % 4 ) == 0 )
  {
   if ( ( year % 100 ) == 0 )
    return false;
   else return true;
  }
  else return false;
 }

 /**
  * 判斷指定日期的年份是否是閏年
  * 
  * @param date
  *            指定日期。
  * @return 是否閏年
  */
 public static synchronized boolean isLeapYear( java.util.Date date )
 {
  /**
   * 詳細設計: 1.被400整除是閏年,否則: 2.不能被4整除則不是閏年 3.能被4整除同時不能被100整除則是閏年
   * 3.能被4整除同時能被100整除則不是閏年
   */
//  int year = date.getYear();
  GregorianCalendar gc = ( GregorianCalendar ) Calendar.getInstance();
  gc.setTime( date );
  int year = gc.get( Calendar.YEAR );
  return isLeapYear( year );
 } 

 public static synchronized boolean isLeapYear( java.util.Calendar gc )
 {
  /**
   * 詳細設計: 1.被400整除是閏年,否則: 2.不能被4整除則不是閏年 3.能被4整除同時不能被100整除則是閏年
   * 3.能被4整除同時能被100整除則不是閏年
   */
  int year = gc.get( Calendar.YEAR );
  return isLeapYear( year );
 } 

 /**
  * 得到指定日期的前一個工作日
  * 
  * @param date
  *            指定日期。
  * @return 指定日期的前一個工作日
  */
 public static synchronized java.util.Date getPreviousWeekDay(
  java.util.Date date )
 {
  {
   /**
    * 詳細設計: 
    * 1.如果date是星期日,則減3天 
    * 2.如果date是星期六,則減2天 
    * 3.否則減1天
    */
   GregorianCalendar gc = ( GregorianCalendar ) Calendar.getInstance();
   gc.setTime( date );
   return getPreviousWeekDay( gc );
//   switch ( gc.get( Calendar.DAY_OF_WEEK ) )
//   {
//    case ( Calendar.MONDAY    ):
//     gc.add( Calendar.DATE, -3 );
//     break;
//    case ( Calendar.SUNDAY    ):
//     gc.add( Calendar.DATE, -2 );
//     break;
//    default:
//     gc.add( Calendar.DATE, -1 );
//     break;
//   }
//   return gc.getTime();
  }
 }

 public static synchronized java.util.Date getPreviousWeekDay(
  java.util.Calendar gc )
 {
  {
   /**
    * 詳細設計: 
    * 1.如果date是星期日,則減3天 
    * 2.如果date是星期六,則減2天 
    * 3.否則減1天
    */
   switch ( gc.get( Calendar.DAY_OF_WEEK ) )
   {
    case ( Calendar.MONDAY    ):
     gc.add( Calendar.DATE, -3 );
     break;
    case ( Calendar.SUNDAY    ):
     gc.add( Calendar.DATE, -2 );
     break;
    default:
     gc.add( Calendar.DATE, -1 );
     break;
   }
   return gc.getTime();
  }
 }

 /**
  * 得到指定日期的後一個工作日
  * 
  * @param date
  *            指定日期。
  * @return 指定日期的後一個工作日
  */
 public static synchronized java.util.Date getNextWeekDay(
  java.util.Date date )
 {
  /**
   * 詳細設計: 
   * 1.如果date是星期五,則加3天 
   * 2.如果date是星期六,則加2天
   * 3.否則加1天
   */
  GregorianCalendar gc = ( GregorianCalendar ) Calendar.getInstance();
  gc.setTime( date );
  switch ( gc.get( Calendar.DAY_OF_WEEK ) )
  {
   case ( Calendar.FRIDAY    ):
    gc.add( Calendar.DATE, 3 );
    break;
   case ( Calendar.SATURDAY    ):
    gc.add( Calendar.DATE, 2 );
    break;
   default:
    gc.add( Calendar.DATE, 1 );
    break;
  }
  return gc.getTime();
 }

 public static synchronized java.util.Calendar getNextWeekDay(
  java.util.Calendar gc )
 {
  /**
   * 詳細設計: 
   * 1.如果date是星期五,則加3天 
   * 2.如果date是星期六,則加2天
   * 3.否則加1天
   */
  switch ( gc.get( Calendar.DAY_OF_WEEK ) )
  {
   case ( Calendar.FRIDAY    ):
    gc.add( Calendar.DATE, 3 );
    break;
   case ( Calendar.SATURDAY    ):
    gc.add( Calendar.DATE, 2 );
    break;
   default:
    gc.add( Calendar.DATE, 1 );
    break;
  }
  return gc;
 }

 /**
  * 取得指定日期的下一個月的最後一天
  * 
  * @param date
  *            指定日期。
  * @return 指定日期的下一個月的最後一天
  */
 public static synchronized java.util.Date getLastDayOfNextMonth(
  java.util.Date date )
 {
  /**
   * 詳細設計: 
   * 1.調用getNextMonth設置當前時間 
   * 2.以1爲基礎,調用getLastDayOfMonth
   */
  GregorianCalendar gc = ( GregorianCalendar ) Calendar.getInstance();
  gc.setTime( date );
  gc.setTime( DateUtil.getNextMonth( gc.getTime() ) );
  gc.setTime( DateUtil.getLastDayOfMonth( gc.getTime() ) );
  return gc.getTime();
 }

 /**
  * 取得指定日期的下一個星期的最後一天
  * 
  * @param date
  *            指定日期。
  * @return 指定日期的下一個星期的最後一天
  */
 public static synchronized java.util.Date getLastDayOfNextWeek(
  java.util.Date date )
 {
  /**
   * 詳細設計: 
   * 1.調用getNextWeek設置當前時間 
   * 2.以1爲基礎,調用getLastDayOfWeek
   */
  GregorianCalendar gc = ( GregorianCalendar ) Calendar.getInstance();
  gc.setTime( date );
  gc.setTime( DateUtil.getNextWeek( gc.getTime() ) );
  gc.setTime( DateUtil.getLastDayOfWeek( gc.getTime() ) );
  return gc.getTime();
 }

 /**
  * 取得指定日期的下一個月的第一天
  * 
  * @param date
  *            指定日期。
  * @return 指定日期的下一個月的第一天
  */
 public static synchronized java.util.Date getFirstDayOfNextMonth(
  java.util.Date date )
 {
  /**
   * 詳細設計: 
   * 1.調用getNextMonth設置當前時間 
   * 2.以1爲基礎,調用getFirstDayOfMonth
   */
  GregorianCalendar gc = ( GregorianCalendar ) Calendar.getInstance();
  gc.setTime( date );
  gc.setTime( DateUtil.getNextMonth( gc.getTime() ) );
  gc.setTime( DateUtil.getFirstDayOfMonth( gc.getTime() ) );
  return gc.getTime();
 }

 public static synchronized java.util.Calendar getFirstDayOfNextMonth(
  java.util.Calendar gc )
 {
  /**
   * 詳細設計: 
   * 1.調用getNextMonth設置當前時間 
   * 2.以1爲基礎,調用getFirstDayOfMonth
   */
  gc.setTime( DateUtil.getNextMonth( gc.getTime() ) );
  gc.setTime( DateUtil.getFirstDayOfMonth( gc.getTime() ) );
  return gc;
 }

 /**
  * 取得指定日期的下一個星期的第一天
  * 
  * @param date
  *            指定日期。
  * @return 指定日期的下一個星期的第一天
  */
 public static synchronized java.util.Date getFirstDayOfNextWeek(
  java.util.Date date )
 {
  /**
   * 詳細設計: 
   * 1.調用getNextWeek設置當前時間 
   * 2.以1爲基礎,調用getFirstDayOfWeek
   */
  GregorianCalendar gc = ( GregorianCalendar ) Calendar.getInstance();
  gc.setTime( date );
  gc.setTime( DateUtil.getNextWeek( gc.getTime() ) );
  gc.setTime( DateUtil.getFirstDayOfWeek( gc.getTime() ) );
  return gc.getTime();
 }

 public static synchronized java.util.Calendar getFirstDayOfNextWeek(
  java.util.Calendar gc )
 {
  /**
   * 詳細設計: 
   * 1.調用getNextWeek設置當前時間 
   * 2.以1爲基礎,調用getFirstDayOfWeek
   */
  gc.setTime( DateUtil.getNextWeek( gc.getTime() ) );
  gc.setTime( DateUtil.getFirstDayOfWeek( gc.getTime() ) );
  return gc;
 }

 /**
  * 取得指定日期的下一個月
  * 
  * @param date
  *            指定日期。
  * @return 指定日期的下一個月
  */
 public static synchronized java.util.Date getNextMonth( java.util.Date date )
 {
  /**
   * 詳細設計: 
   * 1.指定日期的月份加1
   */
  GregorianCalendar gc = ( GregorianCalendar ) Calendar.getInstance();
  gc.setTime( date );
  gc.add( Calendar.MONTH, 1 );
  return gc.getTime();
 }

 public static synchronized java.util.Calendar getNextMonth( java.util.Calendar gc )
 {
  /**
   * 詳細設計: 
   * 1.指定日期的月份加1
   */
  gc.add( Calendar.MONTH, 1 );
  return gc;
 }

 /**
  * 取得指定日期的下一天
  * 
  * @param date
  *            指定日期。
  * @return 指定日期的下一天
  */
 public static synchronized java.util.Date getNextDay( java.util.Date date )
 {
  /**
   * 詳細設計: 1.指定日期加1天
   */
  GregorianCalendar gc = ( GregorianCalendar ) Calendar.getInstance();
  gc.setTime( date );
  gc.add( Calendar.DATE, 1 );
  return gc.getTime();
 }

 public static synchronized java.util.Calendar getNextDay( java.util.Calendar gc )
 {
  /**
   * 詳細設計: 1.指定日期加1天
   */
  gc.add( Calendar.DATE, 1 );
  return gc;
 }

 /**
  * 取得指定日期的下一個星期
  * 
  * @param date
  *            指定日期。
  * @return 指定日期的下一個星期
  */
 public static synchronized java.util.Date getNextWeek( java.util.Date date )
 {
  /**
   * 詳細設計: 
   * 1.指定日期加7天
   */
  GregorianCalendar gc = ( GregorianCalendar ) Calendar.getInstance();
  gc.setTime( date );
  gc.add( Calendar.DATE, 7 );
  return gc.getTime();
 }

 public static synchronized java.util.Calendar getNextWeek( java.util.Calendar gc )
 {
  /**
   * 詳細設計: 
   * 1.指定日期加7天
   */
  gc.add( Calendar.DATE, 7 );
  return gc;
 }

 /**
  * 取得指定日期的所處星期的最後一天
  * 
  * @param date
  *            指定日期。
  * @return 指定日期的所處星期的最後一天
  */
 public static synchronized java.util.Date getLastDayOfWeek(
  java.util.Date date )
 {
  /**
   * 詳細設計: 
   * 1.如果date是星期日,則加6天 
   * 2.如果date是星期一,則加5天 
   * 3.如果date是星期二,則加4天
   * 4.如果date是星期三,則加3天 
   * 5.如果date是星期四,則加2天 
   * 6.如果date是星期五,則加1天
   * 7.如果date是星期六,則加0天
   */
  GregorianCalendar gc = ( GregorianCalendar ) Calendar.getInstance();
  gc.setTime( date );
  switch ( gc.get( Calendar.DAY_OF_WEEK ) )
  {
   case ( Calendar.SUNDAY  ):
    gc.add( Calendar.DATE, 6 );
    break;
   case ( Calendar.MONDAY  ):
    gc.add( Calendar.DATE, 5 );
    break;
   case ( Calendar.TUESDAY  ):
    gc.add( Calendar.DATE, 4 );
    break;
   case ( Calendar.WEDNESDAY  ):
    gc.add( Calendar.DATE, 3 );
    break;
   case ( Calendar.THURSDAY  ):
    gc.add( Calendar.DATE, 2 );
    break;
   case ( Calendar.FRIDAY  ):
    gc.add( Calendar.DATE, 1 );
    break;
   case ( Calendar.SATURDAY  ):
    gc.add( Calendar.DATE, 0 );
    break;
  }
  return gc.getTime();
 }

 /**
  * 取得指定日期的所處星期的第一天
  * 
  * @param date
  *            指定日期。
  * @return 指定日期的所處星期的第一天
  */
 public static synchronized java.util.Date getFirstDayOfWeek(
  java.util.Date date )
 {
  /**
   * 詳細設計: 
   * 1.如果date是星期日,則減0天 
   * 2.如果date是星期一,則減1天 
   * 3.如果date是星期二,則減2天
   * 4.如果date是星期三,則減3天 
   * 5.如果date是星期四,則減4天 
   * 6.如果date是星期五,則減5天
   * 7.如果date是星期六,則減6天
   */
  GregorianCalendar gc = ( GregorianCalendar ) Calendar.getInstance();
  gc.setTime( date );
  switch ( gc.get( Calendar.DAY_OF_WEEK ) )
  {
   case ( Calendar.SUNDAY  ):
    gc.add( Calendar.DATE, 0 );
    break;
   case ( Calendar.MONDAY  ):
    gc.add( Calendar.DATE, -1 );
    break;
   case ( Calendar.TUESDAY  ):
    gc.add( Calendar.DATE, -2 );
    break;
   case ( Calendar.WEDNESDAY  ):
    gc.add( Calendar.DATE, -3 );
    break;
   case ( Calendar.THURSDAY  ):
    gc.add( Calendar.DATE, -4 );
    break;
   case ( Calendar.FRIDAY  ):
    gc.add( Calendar.DATE, -5 );
    break;
   case ( Calendar.SATURDAY  ):
    gc.add( Calendar.DATE, -6 );
    break;
  }
  return gc.getTime();
 }

 public static synchronized java.util.Calendar getFirstDayOfWeek(
  java.util.Calendar gc )
 {
  /**
   * 詳細設計: 
   * 1.如果date是星期日,則減0天 
   * 2.如果date是星期一,則減1天 
   * 3.如果date是星期二,則減2天
   * 4.如果date是星期三,則減3天 
   * 5.如果date是星期四,則減4天 
   * 6.如果date是星期五,則減5天
   * 7.如果date是星期六,則減6天
   */
  switch ( gc.get( Calendar.DAY_OF_WEEK ) )
  {
   case ( Calendar.SUNDAY  ):
    gc.add( Calendar.DATE, 0 );
    break;
   case ( Calendar.MONDAY  ):
    gc.add( Calendar.DATE, -1 );
    break;
   case ( Calendar.TUESDAY  ):
    gc.add( Calendar.DATE, -2 );
    break;
   case ( Calendar.WEDNESDAY  ):
    gc.add( Calendar.DATE, -3 );
    break;
   case ( Calendar.THURSDAY  ):
    gc.add( Calendar.DATE, -4 );
    break;
   case ( Calendar.FRIDAY  ):
    gc.add( Calendar.DATE, -5 );
    break;
   case ( Calendar.SATURDAY  ):
    gc.add( Calendar.DATE, -6 );
    break;
  }
  return gc;
 }

 /**
  * 取得指定日期的所處月份的最後一天
  * 
  * @param date
  *            指定日期。
  * @return 指定日期的所處月份的最後一天
  */
 public static synchronized java.util.Date getLastDayOfMonth(
  java.util.Date date )
 {
  /**
   * 詳細設計: 
   * 1.如果date在1月,則爲31日 
   * 2.如果date在2月,則爲28日 
   * 3.如果date在3月,則爲31日
   * 4.如果date在4月,則爲30日 
   * 5.如果date在5月,則爲31日 
   * 6.如果date在6月,則爲30日
   * 7.如果date在7月,則爲31日 
   * 8.如果date在8月,則爲31日 
   * 9.如果date在9月,則爲30日
   * 10.如果date在10月,則爲31日 
   * 11.如果date在11月,則爲30日 
   * 12.如果date在12月,則爲31日
   * 1.如果date在閏年的2月,則爲29日
   */
  GregorianCalendar gc = ( GregorianCalendar ) Calendar.getInstance();
  gc.setTime( date );
  switch ( gc.get( Calendar.MONTH ) )
  {
   case 0:
    gc.set( Calendar.DAY_OF_MONTH, 31 );
    break;
   case 1:
    gc.set( Calendar.DAY_OF_MONTH, 28 );
    break;
   case 2:
    gc.set( Calendar.DAY_OF_MONTH, 31 );
    break;
   case 3:
    gc.set( Calendar.DAY_OF_MONTH, 30 );
    break;
   case 4:
    gc.set( Calendar.DAY_OF_MONTH, 31 );
    break;
   case 5:
    gc.set( Calendar.DAY_OF_MONTH, 30 );
    break;
   case 6:
    gc.set( Calendar.DAY_OF_MONTH, 31 );
    break;
   case 7:
    gc.set( Calendar.DAY_OF_MONTH, 31 );
    break;
   case 8:
    gc.set( Calendar.DAY_OF_MONTH, 30 );
    break;
   case 9:
    gc.set( Calendar.DAY_OF_MONTH, 31 );
    break;
   case 10:
    gc.set( Calendar.DAY_OF_MONTH, 30 );
    break;
   case 11:
    gc.set( Calendar.DAY_OF_MONTH, 31 );
    break;
  }
  //檢查閏年
  if ( ( gc.get( Calendar.MONTH ) == Calendar.FEBRUARY )
   && ( isLeapYear( gc.get( Calendar.YEAR ) ) ) )
  {
   gc.set( Calendar.DAY_OF_MONTH, 29 );
  }
  return gc.getTime();
 }

 public static synchronized java.util.Calendar getLastDayOfMonth(
  java.util.Calendar gc )
 {
  /**
   * 詳細設計: 
   * 1.如果date在1月,則爲31日 
   * 2.如果date在2月,則爲28日 
   * 3.如果date在3月,則爲31日
   * 4.如果date在4月,則爲30日 
   * 5.如果date在5月,則爲31日 
   * 6.如果date在6月,則爲30日
   * 7.如果date在7月,則爲31日 
   * 8.如果date在8月,則爲31日 
   * 9.如果date在9月,則爲30日
   * 10.如果date在10月,則爲31日 
   * 11.如果date在11月,則爲30日 
   * 12.如果date在12月,則爲31日
   * 1.如果date在閏年的2月,則爲29日
   */
  switch ( gc.get( Calendar.MONTH ) )
  {
   case 0:
    gc.set( Calendar.DAY_OF_MONTH, 31 );
    break;
   case 1:
    gc.set( Calendar.DAY_OF_MONTH, 28 );
    break;
   case 2:
    gc.set( Calendar.DAY_OF_MONTH, 31 );
    break;
   case 3:
    gc.set( Calendar.DAY_OF_MONTH, 30 );
    break;
   case 4:
    gc.set( Calendar.DAY_OF_MONTH, 31 );
    break;
   case 5:
    gc.set( Calendar.DAY_OF_MONTH, 30 );
    break;
   case 6:
    gc.set( Calendar.DAY_OF_MONTH, 31 );
    break;
   case 7:
    gc.set( Calendar.DAY_OF_MONTH, 31 );
    break;
   case 8:
    gc.set( Calendar.DAY_OF_MONTH, 30 );
    break;
   case 9:
    gc.set( Calendar.DAY_OF_MONTH, 31 );
    break;
   case 10:
    gc.set( Calendar.DAY_OF_MONTH, 30 );
    break;
   case 11:
    gc.set( Calendar.DAY_OF_MONTH, 31 );
    break;
  }
  //檢查閏年
  if ( ( gc.get( Calendar.MONTH ) == Calendar.FEBRUARY )
   && ( isLeapYear( gc.get( Calendar.YEAR ) ) ) )
  {
   gc.set( Calendar.DAY_OF_MONTH, 29 );
  }
  return gc;
 }

 /**
  * 取得指定日期的所處月份的第一天
  * 
  * @param date
  *            指定日期。
  * @return 指定日期的所處月份的第一天
  */
 public static synchronized java.util.Date getFirstDayOfMonth( java.util.Date date )
 {
  /**
   * 詳細設計: 1.設置爲1號
   */
  GregorianCalendar gc = ( GregorianCalendar ) Calendar.getInstance();
  gc.setTime( date );
  gc.set( Calendar.DAY_OF_MONTH, 1 );
  return gc.getTime();
 }

 public static synchronized java.util.Calendar getFirstDayOfMonth( java.util.Calendar gc )
 {
  /**
   * 詳細設計: 1.設置爲1號
   */
  gc.set( Calendar.DAY_OF_MONTH, 1 );
  return gc;
 }

 /**
  * 將日期對象轉換成爲指定ORA日期、時間格式的字符串形式。如果日期對象爲空,返回 一個空字符串對象,而不是一個空對象。
  * 
  * @param theDate
  *            將要轉換爲字符串的日期對象。
  * @param hasTime
  *            如果返回的字符串帶時間則爲true
  * @return 轉換的結果
  */
 public static synchronized String toOraString( Date theDate, boolean hasTime )
 {
  /**
   * 詳細設計: 
   * 1.如果有時間,則設置格式爲getOraDateTimeFormat()的返回值
   * 2.否則設置格式爲getOraDateFormat()的返回值 
   * 3.調用toString(Date theDate, DateFormat
   * theDateFormat)
   */
  DateFormat theFormat;
  if ( hasTime )
  {
   theFormat = getOraDateTimeFormat();
  }
  else
  {
   theFormat = getOraDateFormat();
  }
  return toString( theDate, theFormat );
 }

 /**
  * 將日期對象轉換成爲指定日期、時間格式的字符串形式。如果日期對象爲空,返回 一個空字符串對象,而不是一個空對象。
  * 
  * @param theDate
  *            將要轉換爲字符串的日期對象。
  * @param hasTime
  *            如果返回的字符串帶時間則爲true
  * @return 轉換的結果
  */
 public static synchronized String toString( Date theDate, boolean hasTime )
 {
  /**
   * 詳細設計: 
   * 1.如果有時間,則設置格式爲getDateTimeFormat的返回值 
   * 2.否則設置格式爲getDateFormat的返回值
   * 3.調用toString(Date theDate, DateFormat theDateFormat)
   */
  DateFormat theFormat;
  if ( hasTime )
  {
   theFormat = getDateTimeFormat();
  }
  else
  {
   theFormat = getDateFormat();
  }
  return toString( theDate, theFormat );
 }

 /**
  * 標準日期格式
  */
 private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat(
  "MM/dd/yyyy" );
 /**
  * 標準時間格式
  */
 private static final SimpleDateFormat DATE_TIME_FORMAT = new SimpleDateFormat(
  "MM/dd/yyyy HH:mm" );
 /**
  * 帶時分秒的標準時間格式
  */
 private static final SimpleDateFormat DATE_TIME_EXTENDED_FORMAT = new SimpleDateFormat(
  "MM/dd/yyyy HH:mm:ss" );
 /**
  * ORA標準日期格式
  */
 private static final SimpleDateFormat ORA_DATE_FORMAT = new SimpleDateFormat(
  "yyyyMMdd" );
 /**
  * ORA標準時間格式
  */
 private static final SimpleDateFormat ORA_DATE_TIME_FORMAT = new SimpleDateFormat(
  "yyyyMMddHHmm" );
 /**
  * 帶時分秒的ORA標準時間格式
  */
 private static final SimpleDateFormat ORA_DATE_TIME_EXTENDED_FORMAT = new SimpleDateFormat(
  "yyyyMMddHHmmss" );

 /**
  * 創建一個標準日期格式的克隆
  * 
  * @return 標準日期格式的克隆
  */
 public static synchronized DateFormat getDateFormat()
 {
  /**
   * 詳細設計: 1.返回DATE_FORMAT
   */
  SimpleDateFormat theDateFormat = ( SimpleDateFormat ) 
   DATE_FORMAT.clone();
  theDateFormat.setLenient( false );
  return theDateFormat;
 }

 /**
  * 創建一個標準時間格式的克隆
  * 
  * @return 標準時間格式的克隆
  */
 public static synchronized DateFormat getDateTimeFormat()
 {
  /**
   * 詳細設計: 1.返回DATE_TIME_FORMAT
   */
  SimpleDateFormat theDateTimeFormat = ( SimpleDateFormat ) DATE_TIME_FORMAT
   .clone();
  theDateTimeFormat.setLenient( false );
  return theDateTimeFormat;
 }

 /**
  * 創建一個標準ORA日期格式的克隆
  * 
  * @return 標準ORA日期格式的克隆
  */
 public static synchronized DateFormat getOraDateFormat()
 {
  /**
   * 詳細設計: 1.返回ORA_DATE_FORMAT
   */
  SimpleDateFormat theDateFormat = ( SimpleDateFormat ) ORA_DATE_FORMAT
   .clone();
  theDateFormat.setLenient( false );
  return theDateFormat;
 }

 /**
  * 創建一個標準ORA時間格式的克隆
  * 
  * @return 標準ORA時間格式的克隆
  */
 public static synchronized DateFormat getOraDateTimeFormat()
 {
  /**
   * 詳細設計: 1.返回ORA_DATE_TIME_FORMAT
   */
  SimpleDateFormat theDateTimeFormat = ( SimpleDateFormat ) 
   ORA_DATE_TIME_FORMAT.clone();
  theDateTimeFormat.setLenient( false );
  return theDateTimeFormat;
 }

 /**
  * 將一個日期對象轉換成爲指定日期、時間格式的字符串。 如果日期對象爲空,返回一個空字符串,而不是一個空對象。
  * 
  * @param theDate
  *            要轉換的日期對象
  * @param theDateFormat
  *            返回的日期字符串的格式
  * @return 轉換結果
  */
 public static synchronized String toString( Date theDate,
  DateFormat theDateFormat )
 {
  /**
   * 詳細設計: 
   * 1.theDate爲空,則返回"" 
   * 2.否則使用theDateFormat格式化
   */
  if ( theDate == null ) 
   return "";
  return theDateFormat.format( theDate );
 }
}

發佈了36 篇原創文章 · 獲贊 0 · 訪問量 1443
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章