日期工具类

package  commons.util;


import  java.text.DateFormat;
import  java.text.ParseException;
import  java.text.SimpleDateFormat;

import  java.util.Calendar;
import  java.util.Date;


/**
 * 日期工具类
 
*/
public   class  DateHelper
{
    
/**
     * 时间范围:年
     
*/
    
public   static   final   int  YEAR  =   1 ;

    
/**
     * 时间范围:季度
     
*/
    
public   static   final   int  QUARTER  =   2 ;

    
/**
     * 时间范围:月
     
*/
    
public   static   final   int  MONTH  =   3 ;

    
/**
     * 时间范围:旬
     
*/
    
public   static   final   int  TENDAYS  =   4 ;

    
/**
     * 时间范围:周
     
*/
    
public   static   final   int  WEEK  =   5 ;

    
/**
     * 时间范围:日
     
*/
    
public   static   final   int  DAY  =   6 ;

    
/*  基准时间  */
    
private  Date fiducialDate  =   null ;
    
private  Calendar cal  =   null ;


    
private  DateHelper(Date fiducialDate)
    {
        
if  (fiducialDate  !=   null )
        {
            
this .fiducialDate  =  fiducialDate;
        }
        
else
        {
            
this .fiducialDate  =   new  Date(System.currentTimeMillis());
        }

        
this .cal  =  Calendar.getInstance();
        
this .cal.setTime( this .fiducialDate);
        
this .cal.set(Calendar.HOUR_OF_DAY,  0 );
        
this .cal.set(Calendar.MINUTE,  0 );
        
this .cal.set(Calendar.SECOND,  0 );
        
this .cal.set(Calendar.MILLISECOND,  0 );

        
this .fiducialDate  =   this .cal.getTime();
    }


    
/**
     * 获取DateHelper实例
     * 
@param  fiducialDate
     * 基准时间
     * 
@return
     
*/
    
public   static  DateHelper getInstance(Date fiducialDate)
    {
        
return   new  DateHelper(fiducialDate);
    }

    
/**
     * 获取DateHelper实例, 使用当前时间作为基准时间
     * 
@return
     
*/
    
public   static  DateHelper getInstance()
    {
        
return   new  DateHelper( null );
    }


    
/**
     * 获取年的第一天
     * 
@param  offset
     * 偏移量
     * 
@return
     
*/
    
public  Date getFirstDayOfYear( int  offset)
    {
        cal.setTime(
this .fiducialDate);
        cal.set(Calendar.YEAR, cal.get(Calendar.YEAR) 
+  offset);
        cal.set(Calendar.MONTH, Calendar.JANUARY);
        cal.set(Calendar.DAY_OF_MONTH, 
1 );
        
return  cal.getTime();
    }

    
/**
     * 获取年的最后一天
     * 
@param  offset
     * 偏移量
     * 
@return
     
*/
    
public  Date getLastDayOfYear( int  offset)
    {
        cal.setTime(
this .fiducialDate);
        cal.set(Calendar.YEAR, cal.get(Calendar.YEAR) 
+  offset);
        cal.set(Calendar.MONTH, Calendar.DECEMBER);
        cal.set(Calendar.DAY_OF_MONTH, 
31 );
        
return  cal.getTime();
    }

    
/**
     * 获取季度的第一天
     * 
@param  offset
     * 偏移量
     * 
@return
     
*/
    
public  Date getFirstDayOfQuarter( int  offset)
    {
        cal.setTime(
this .fiducialDate);
        cal.add(Calendar.MONTH, offset 
*   3 );
        
int  mon  =  cal.get(Calendar.MONTH);
        
if  (mon  >=  Calendar.JANUARY  &&  mon  <=  Calendar.MARCH)
        {
            cal.set(Calendar.MONTH, Calendar.JANUARY);
            cal.set(Calendar.DAY_OF_MONTH, 
1 );
        }
        
if  (mon  >=  Calendar.APRIL  &&  mon  <=  Calendar.JUNE)
        {
            cal.set(Calendar.MONTH, Calendar.APRIL);
            cal.set(Calendar.DAY_OF_MONTH, 
1 );
        }
        
if  (mon  >=  Calendar.JULY  &&  mon  <=  Calendar.SEPTEMBER)
        {
            cal.set(Calendar.MONTH, Calendar.JULY);
            cal.set(Calendar.DAY_OF_MONTH, 
1 );
        }
        
if  (mon  >=  Calendar.OCTOBER  &&  mon  <=  Calendar.DECEMBER)
        {
            cal.set(Calendar.MONTH, Calendar.OCTOBER);
            cal.set(Calendar.DAY_OF_MONTH, 
1 );
        }
        
return  cal.getTime();
    }

    
/**
     * 获取季度的最后一天
     * 
@param  offset
     * 偏移量
     * 
@return
     
*/
    
public  Date getLastDayOfQuarter( int  offset)
    {
        cal.setTime(
this .fiducialDate);
        cal.add(Calendar.MONTH, offset 
*   3 );

        
int  mon  =  cal.get(Calendar.MONTH);
        
if  (mon  >=  Calendar.JANUARY  &&  mon  <=  Calendar.MARCH)
        {
            cal.set(Calendar.MONTH, Calendar.MARCH);
            cal.set(Calendar.DAY_OF_MONTH, 
31 );
        }
        
if  (mon  >=  Calendar.APRIL  &&  mon  <=  Calendar.JUNE)
        {
            cal.set(Calendar.MONTH, Calendar.JUNE);
            cal.set(Calendar.DAY_OF_MONTH, 
30 );
        }
        
if  (mon  >=  Calendar.JULY  &&  mon  <=  Calendar.SEPTEMBER)
        {
            cal.set(Calendar.MONTH, Calendar.SEPTEMBER);
            cal.set(Calendar.DAY_OF_MONTH, 
30 );
        }
        
if  (mon  >=  Calendar.OCTOBER  &&  mon  <=  Calendar.DECEMBER)
        {
            cal.set(Calendar.MONTH, Calendar.DECEMBER);
            cal.set(Calendar.DAY_OF_MONTH, 
31 );
        }
        
return  cal.getTime();
    }

    
/**
     * 获取月的最后一天
     * 
@param  offset
     * 偏移量
     * 
@return
     
*/
    
public  Date getFirstDayOfMonth( int  offset)
    {
        cal.setTime(
this .fiducialDate);
        cal.add(Calendar.MONTH, offset);
        cal.set(Calendar.DAY_OF_MONTH, 
1 );
        
return  cal.getTime();
    }

    
/**
     * 获取月的最后一天
     * 
@param  offset
     * 偏移量
     * 
@return
     
*/
    
public  Date getLastDayOfMonth( int  offset)
    {
        cal.setTime(
this .fiducialDate);
        cal.add(Calendar.MONTH, offset 
+   1 );
        cal.set(Calendar.DAY_OF_MONTH, 
1 );
        cal.add(Calendar.DAY_OF_MONTH, 
- 1 );
        
return  cal.getTime();
    }

    
/**
     * 获取旬的第一天
     * 
@param  offset
     * 偏移量
     * 
@return
     
*/
    
public  Date getFirstDayOfTendays( int  offset)
    {
        cal.setTime(
this .fiducialDate);
        
int  day  =  cal.get(Calendar.DAY_OF_MONTH);
        
if  (day  >=   21 )
        {
            day 
=   21 ;
        }
        
else   if  (day  >=   11 )
        {
            day 
=   11 ;
        }
        
else
        {
            day 
=   1 ;
        }

        
if  (offset  >   0 )
        {
            day 
=  day  +   10   *  offset;
            
int  monOffset  =  day  /   30 ;
            day 
=  day  %   30 ;
            cal.add(Calendar.MONTH, monOffset);
            cal.set(Calendar.DAY_OF_MONTH, day);
        }
        
else
        {
            
int  monOffset  =   10   *  offset  /   30 ;
            
int  dayOffset  =   10   *  offset  %   30 ;
            
if  ((day  +  dayOffset)  >   0 )
            {
                day 
=  day  +  dayOffset;
            }
            
else
            {
                monOffset 
=  monOffset  -   1 ;
                day 
=  day  -  dayOffset  -   10 ;
            }
            cal.add(Calendar.MONTH, monOffset);
            cal.set(Calendar.DAY_OF_MONTH, day);
        }
        
return  cal.getTime();
    }

    
/**
     * 获取旬的最后一天
     * 
@param  offset
     * 偏移量
     * 
@return
     
*/
    
public  Date getLastDayOfTendays( int  offset)
    {
        Date date 
=  getFirstDayOfTendays(offset  +   1 );
        cal.setTime(date);
        cal.add(Calendar.DAY_OF_MONTH, 
- 1 );
        
return  cal.getTime();
    }

    
/**
     * 获取周的第一天(MONDAY)
     * 
@param  offset
     * 偏移量
     * 
@return
     
*/
    
public  Date getFirstDayOfWeek( int  offset)
    {
        cal.setTime(
this .fiducialDate);
        cal.add(Calendar.DAY_OF_MONTH, offset 
*   7 );
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        
return  cal.getTime();
    }

    
/**
     * 获取周的最后一天(SUNDAY)
     * 
@param  offset
     * 偏移量
     * 
@return
     
*/
    
public  Date getLastDayOfWeek( int  offset)
    {
        cal.setTime(
this .fiducialDate);
        cal.add(Calendar.DAY_OF_MONTH, offset 
*   7 );
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        cal.add(Calendar.DAY_OF_MONTH, 
6 );
        
return  cal.getTime();
    }

    
/**
     * 获取指定时间范围的第一天
     * 
@param  dateRangeType
     * 时间范围类型
     * 
@param  offset
     * 偏移量
     * 
@return
     
*/
    
private  Date getFirstDate( int  dateRangeType,  int  offset)
    {
        
return   null ;
    }

    
/**
     * 获取指定时间范围的最后一天
     * 
@param  dateRangeType
     * 时间范围类型
     * 
@param  offset
     * 偏移量
     * 
@return
     
*/
    
private  Date getLastDate( int  dateRangeType,  int  offset)
    {
        
return   null ;
    }

    
/**
     * 根据日历的规则,为基准时间添加指定日历字段的时间量
     * 
@param  field
     * 日历字段, 使用Calendar类定义的日历字段常量
     * 
@param  offset
     * 偏移量
     * 
@return
     
*/
    
public  Date add( int  field,  int  offset)
    {
        cal.setTime(
this .fiducialDate);
        cal.add(field, offset);
        
return  cal.getTime();
    }

    
/**
     * 根据日历的规则,为基准时间添加指定日历字段的单个时间单元
     * 
@param  field
     * 日历字段, 使用Calendar类定义的日历字段常量
     * 
@param  up
     * 指定日历字段的值的滚动方向。true:向上滚动 / false:向下滚动
     * 
@return
     
*/
    
public  Date roll( int  field,  boolean  up)
    {
        cal.setTime(
this .fiducialDate);
        cal.roll(field, up);
        
return  cal.getTime();
    }

    
/**
     * 把字符串转换为日期
     * 
@param  dateStr 
     * 日期字符串
     * 
@param  format
     * 日期格式
     * 
@return  
     
*/
    
public   static  Date strToDate(String dateStr, String format)
    {
        Date date 
=   null ;

        
if  (dateStr  !=   null   &&  ( ! dateStr.equals( "" )))
        {
            DateFormat df 
=   new  SimpleDateFormat(format);
            
try
            {
                date 
=  df.parse(dateStr);
            }
            
catch  (ParseException e)
            {
                e.printStackTrace();
            }
        }
        
return  date;
    }

    
/**
     * 把字符串转换为日期,日期的格式为yyyy-MM-dd HH:ss
     * 
@param  dateStr 
     * 日期字符串
     * 
@return  
     
*/
    
public   static  Date strToDate(String dateStr)
    {
        Date date 
=   null ;

        
if  (dateStr  !=   null   &&  ( ! dateStr.equals( "" )))
        {
            
if  (dateStr.matches( " //d{4}-//d{1,2}-//d{1,2} " ))
            {
                dateStr 
=  dateStr  +   "  00:00 " ;
            }
            
else   if  (dateStr.matches( " //d{4}-//d{1,2}-//d{1,2} //d{1,2} " ))
            {
                dateStr 
=  dateStr  +   " :00 " ;
            }
            
else
            {
                System.out.println(dateStr 
+   "  格式不正确 " );
                
return   null ;
            }
            DateFormat df 
=   new  SimpleDateFormat( " yyyy-MM-dd HH:ss " );
            
try
            {
                date 
=  df.parse(dateStr);
            }
            
catch  (ParseException e)
            {
                e.printStackTrace();
            }
        }
        
return  date;
    }

    
/**
     * 把日期转换为字符串
     * 
@param  date
     * 日期实例
     * 
@param  format
     * 日期格式
     * 
@return
     
*/
    
public   static  String dateToStr(Date date, String format)
    {
        
return  (date  ==   null ) ?   ""
               
new  SimpleDateFormat(format).format(date);
    }

    
/**
     * 取得当前日期 年-月-日
     * 
@return
     
*/
    
public   static  String getCurrentDate()
    {
        DateFormat f 
=   new  SimpleDateFormat( " yyyy-MM-dd " );
        
return  f.format(Calendar.getInstance().getTime());
    }


    
public   static   void  main(String[] args)
    {
        DateHelper dateHelper 
=  DateHelper.getInstance();

        
/*  Year  */
        
for  ( int  i  =   - 5 ; i  <=   5 ; i ++ )
        {
            System.out.println(
" FirstDayOfYear( "   +  i  +   " ) =  "   +  
                               dateHelper.getFirstDayOfYear(i));
            System.out.println(
" LastDayOfYear( "   +  i  +   " ) =  "   +  
                               dateHelper.getLastDayOfYear(i));
        }

        
/*  Quarter  */
        
for  ( int  i  =   - 5 ; i  <=   5 ; i ++ )
        {
            System.out.println(
" FirstDayOfQuarter( "   +  i  +   " ) =  "   +  
                               dateHelper.getFirstDayOfQuarter(i));
            System.out.println(
" LastDayOfQuarter( "   +  i  +   " ) =  "   +  
                               dateHelper.getLastDayOfQuarter(i));
        }

        
/*  Month  */
        
for  ( int  i  =   - 5 ; i  <=   5 ; i ++ )
        {
            System.out.println(
" FirstDayOfMonth( "   +  i  +   " ) =  "   +  
                               dateHelper.getFirstDayOfMonth(i));
            System.out.println(
" LastDayOfMonth( "   +  i  +   " ) =  "   +  
                               dateHelper.getLastDayOfMonth(i));
        }

        
/*  Week  */
        
for  ( int  i  =   - 5 ; i  <=   5 ; i ++ )
        {
            System.out.println(
" FirstDayOfWeek( "   +  i  +   " ) =  "   +  
                               dateHelper.getFirstDayOfWeek(i));
            System.out.println(
" LastDayOfWeek( "   +  i  +   " ) =  "   +  
                               dateHelper.getLastDayOfWeek(i));
        }

        
/*  Tendays  */
        
for  ( int  i  =   - 5 ; i  <=   5 ; i ++ )
        {
            System.out.println(
" FirstDayOfTendays( "   +  i  +   " ) =  "   +  
                               dateHelper.getFirstDayOfTendays(i));
            System.out.println(
" LastDayOfTendays( "   +  i  +   " ) =  "   +  
                               dateHelper.getLastDayOfTendays(i));
        }


    }

}
=============================
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
/**
* 计算任意2个日期内的工作日(没有考虑到国定假日)
* @author user
*
*/
public class DateCal {

/**
* @param args
*/
public static void main(String[] args) {
try {

String strDateStart = "2006-10-1";
String strDateEnd = "2006-10-14";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date_start = sdf.parse(strDateStart);
Date date_end = sdf.parse(strDateEnd);
DateCal app = new DateCal();
Calendar cal_start = Calendar.getInstance();
Calendar cal_end = Calendar.getInstance();
cal_start.setTime(date_start);
cal_end.setTime(date_end);
System.out.println("星期-->" + app.getChineseWeek(cal_start)
+ " 日期-->" + cal_start.get(Calendar.YEAR) + "-"
+ (cal_start.get(Calendar.MONTH) + 1) + "-"
+ cal_start.get(Calendar.DAY_OF_MONTH));
System.out.println("星期-->" + app.getChineseWeek(cal_end) + " 日期-->"
+ cal_end.get(Calendar.YEAR) + "-"
+ (cal_end.get(Calendar.MONTH) + 1) + "-"
+ cal_end.get(Calendar.DAY_OF_MONTH));
System.out.println("工作日为-->"
+ app.getWorkingDay(cal_start, cal_end));
System.out.println("休息日-->"+app.getHolidays(cal_start, cal_end));
} catch (Exception e) {
// TODO: handle exception
}
}

public int getDaysBetween(java.util.Calendar d1, java.util.Calendar d2) {
if (d1.after(d2)) { // swap dates so that d1 is start and d2 is end
java.util.Calendar swap = d1;
d1 = d2;
d2 = swap;
}
int days = d2.get(java.util.Calendar.DAY_OF_YEAR)
- d1.get(java.util.Calendar.DAY_OF_YEAR);
int y2 = d2.get(java.util.Calendar.YEAR);
if (d1.get(java.util.Calendar.YEAR) != y2) {
d1 = (java.util.Calendar) d1.clone();
do {
days += d1.getActualMaximum(java.util.Calendar.DAY_OF_YEAR);
d1.add(java.util.Calendar.YEAR, 1);
} while (d1.get(java.util.Calendar.YEAR) != y2);
}
return days;
}

/**
* 计算2个日期之间的相隔天数
* @param d1
* @param d2
* @return
*/
public int getWorkingDay(java.util.Calendar d1, java.util.Calendar d2) {
int result = -1;
if (d1.after(d2)) { // swap dates so that d1 is start and d2 is end
java.util.Calendar swap = d1;
d1 = d2;
d2 = swap;
}

int betweendays = getDaysBetween(d1, d2);


int charge_date = 0;
int charge_start_date = 0;//开始日期的日期偏移量
int charge_end_date = 0;//结束日期的日期偏移量
// 日期不在同一个日期内
int stmp;
int etmp;
stmp = 7 - d1.get(Calendar.DAY_OF_WEEK);
etmp = 7 - d2.get(Calendar.DAY_OF_WEEK);
if (stmp != 0 && stmp != 6) {// 开始日期为星期六和星期日时偏移量为0
charge_start_date = stmp - 1;
}
if (etmp != 0 && etmp != 6) {// 结束日期为星期六和星期日时偏移量为0
charge_end_date = etmp - 1;
}
// }
result = (getDaysBetween(this.getNextMonday(d1), this.getNextMonday(d2)) / 7)
* 5 + charge_start_date - charge_end_date;
//System.out.println("charge_start_date>" + charge_start_date);
//System.out.println("charge_end_date>" + charge_end_date);
//System.out.println("between day is-->" + betweendays);
return result;
}

public String getChineseWeek(Calendar date) {
final String dayNames[] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五",
"星期六" };

int dayOfWeek = date.get(Calendar.DAY_OF_WEEK);

// System.out.println(dayNames[dayOfWeek - 1]);
return dayNames[dayOfWeek - 1];

}

/**
* 获得日期的下一个星期一的日期
*
* @param date
* @return
*/
public Calendar getNextMonday(Calendar date) {
Calendar result = null;
result = date;
do {
result = (Calendar) result.clone();
result.add(Calendar.DATE, 1);
} while (result.get(Calendar.DAY_OF_WEEK) != 2);
return result;
}

/**
*
* @param d1
* @param d2
* @return
*/
public int getHolidays(Calendar d1,Calendar d2){
return this.getDaysBetween(d1, d2)-this.getWorkingDay(d1, d2);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值