java 实现工作日计算

注:数据需要手动维护,每年维护一次,当年12月份国家会公布第二年法定节假日 日期及天数

1.表结构

 CREATE TABLE `sys_calendar` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `days` varchar(200) DEFAULT NULL COMMENT '日期',
  `workmarkers` varchar(255) DEFAULT NULL COMMENT '是否工作日',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1462 DEFAULT CHARSET=utf8mb4 COMMENT='自定义日历表(区分工作日)';

2.计算代码

public class DateOper {

    private String holidays;//放假日
    private String workdays;//工作日
    public DateOper() {
        String sqlholiday = "select days from sys_calendar where workmarkers='N'";// 这不是工作日查询
        String sqlworkday = "select days from sys_calendar where workmarkers='Y'";//工作日查询
        // 得到今年和明年的所有的假日
        ArrayList<HashMap<String, String>> holidayList = DBoper.QueryData(sqlholiday);
        if(holidayList!=null && holidayList.size()>0)
        {
            for(int i=0;i<holidayList.size();i++)
            {
                Map row = holidayList.get(i);

                holidays += row.get("days").toString() + ",";
            }
        }
        System.out.println(holidays);

        // 得到今年和明年的所有的假日
        ArrayList<HashMap<String, String>> workdayList = DBoper.QueryData(sqlworkday);
        if(workdayList!=null && workdayList.size()>=0)
        {
            for(int i=0;i<workdayList.size();i++)
            {
                Map row = workdayList.get(i);

                workdays += row.get("days").toString() + ",";

            }
        }
        System.out.println(workdays);
    }

    public  int countWorkDay(String start1, String end1) {
        String strsql;
        // 工作日
        int workDay = 0;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date start=null;
        Date end = null;

        try {
            start=(Date) sdf.parse(start1);
            end = (Date) sdf.parse(end1);
        } catch (ParseException e) {
            System.out.println("非法的日期格式,无法进行转换");
            e.printStackTrace();
        }
        //int thisyear = start.getYear() + 1900;
        //int nextyear = thisyear == end.getYear() ? thisyear + 1 : end.getYear() + 1900;

        System.out.println("start>>"+start+"   end>>"+end);
        int days = getDutyDays(start, end);
        System.out.println("start>>"+start1+"   end>>"+end1+"   days>>"+days);
        return days;
    }

    public  int getDutyDays(Date StartDate,Date EndDate) {//得到非周六周日的工作日
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        StartDate.setDate(StartDate.getDate() + 1);
        int result = 0;
        while (StartDate.compareTo(EndDate) <= 0) {

            if (StartDate.getDay() != 6 && StartDate.getDay() != 0)//周内
            {
                result++;
                // System.out.println(holidays);
                if(!holidays.isEmpty())
                {
                    if(holidays.indexOf(sdf.format(StartDate))>-1)//不是节假日加1
                        result--;
                }

            }
            else    //周末
            {    if(!workdays.isEmpty())
            {
                if(workdays.indexOf(sdf.format(StartDate))>-1)//工作日
                    result++;
            }
            }
            //    System.out.println(StartDate+"-------"+StartDate.getDay()+"-----"+result+"******"+holidays.indexOf(sdf.format(StartDate))+"******"+workdays.indexOf(sdf.format(StartDate)));
            StartDate.setDate(StartDate.getDate() + 1);
        }
        return result;
    }

}
3.调用代码()

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值