java实现节假日及应休天数计算

这个Java程序计算从特定日期开始到结束日期的工作日,考虑了周末和法定节假日。它首先查找日期范围内包含的节假日,并计算这些日期之外的工作日,然后加上周末天数。目前仅处理同一年的情况,不涉及跨年问题。

需求:可计算实际应休天数,例从6月1日没休息一直干到8月1日,期间经历了周未若干,及法定节假日,需要将周未应补假期及法定节假日假期一同统计出来。

网上找了好多应休天数计算的,都是只计算周未的,都没我要的。 so  自己写了一个。 但这只是个基本实现,没考虑到跨年的问题。

 

红字部分为此程序的基本思想。

 

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 *
 */

/**
 *
 * 文件建立于2009-6-24
 */
public class WorkDay {

    /**
     * @param args
     */
    /*
     * 先找时间段内包含的节日,确定节日中是否经历周未
     * 如有周未,先计算除周未外的假日天数,最后再计算周未天数

     */
    public int ds=3;           //节假日休息天数
    Map map1=new HashMap();   //节假日名:起休日期
    Map map2=new HashMap();    //起休日期:止休日期
    public String st="2009-04-12";
    public String et="2009-06-18";
    public int jiari=0;
    
    public WorkDay() throws ParseException{
        map1.put("5.1", "05-01");
        map2.put("05-01", "05-03");
        
        String st1=map1.get("5.1").toString();
        String et1=map2.get(st1).toString();
        
        SimpleDateFormat sdf=new SimpleDateFormat("MM-dd");
        SimpleDateFormat sdf2=new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sdf3=new SimpleDateFormat("yyyy");
        
        Date sti=sdf.parse(st.substring(5));
        Date eti=sdf.parse(et.substring(5));
        Date i = sdf.parse(st1);
        Date i2= sdf.parse(et1);
        /*
         * 节日日期需在起休日之后    且   节日多出起停日期的部分也需不计
         * 外国的星期一为中国的星期天
         */
        if(sdf3.parse(st.substring(0,4)).compareTo(sdf3.parse(et.substring(0,4)))==0){
        if(i.after(sti)){ //如果节日起休日在任务日当中
            if(i2.before(eti)){  //如果节日休止日在任务日当中
                /*
                 * 同年份,任务起始日和终止日如果跨一个年份的话,可能计算会出现比较大的误差
                 * 等测试
                 */
                
                Calendar ca=Calendar.getInstance();
                ca.setTime(sdf2.parse(st.substring(0,5)+st1));
                for(int k=0;k<ds-1;k++){
                    ca.add(Calendar.DAY_OF_MONTH, k);
                    if(ca.get(Calendar.DAY_OF_WEEK)==7||ca.get(Calendar.DAY_OF_WEEK)==1)
                        continue;
                    else jiari++;
                }
                ca.setTime(sdf2.parse(st));
                int xinqi=ca.get(Calendar.DAY_OF_WEEK);
                int t1=ca.get(Calendar.DAY_OF_YEAR);
                ca.setTime(sdf2.parse(et));
                int t2=ca.get(Calendar.DAY_OF_YEAR);
                
                if(xinqi==1){
                    jiari+=((t2-t1)/7)*2+1;
                }else{
                    jiari+=(t2-t1+1-(7-xinqi+2))*2/7+1;
                }
            
                }
            }
        }
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        /*Calendar ca=Calendar.getInstance();
        try {
            ca.setTime(new SimpleDateFormat("yyyy-MM").parse("2008-02"));
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(ca.getActualMaximum(Calendar.DATE));*/
        WorkDay wd=new WorkDay();

        System.out.println(wd.jiari);
    }

}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值