Java计算时间区间内工作日天数

实际生活中,国家法定假日可能与周六周日重叠,所以需要去重。对于放假补班的特殊情况,需要另外补充

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class Test {
	public static void main(String[] args) throws ParseException {
		workDay("2019-03-01~2019-05-08","section","");
	}
	public static boolean isWeekend(String bDate) throws ParseException {
        DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
        Date bdate = format1.parse(bDate);
        Calendar cal = Calendar.getInstance();
        cal.setTime(bdate);
        if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY){
            return true;
        } else{
            return false;
        }
	}
	
	public  static List<String> getDayListOfDate(String beginDateStr, String endDateStr) {
        SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
        Date beginDate = null;
        Date endDate = null;
        Calendar beginGC = null;
        Calendar endGC = null;
        List<String> list = new ArrayList<String>();
        try {
            beginDate = f.parse(beginDateStr);
            endDate = f.parse(endDateStr);
            beginGC = Calendar.getInstance();
            beginGC.setTime(beginDate);
            endGC = Calendar.getInstance();
            endGC.setTime(endDate);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            while (beginGC.getTime().compareTo(endGC.getTime()) <= 0) {
                list.add(sdf.format(beginGC.getTime()));
                beginGC.add(Calendar.DAY_OF_MONTH, 1);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
	
	public static List<String> getWeekendListOfDate(String beginDateStr, String endDateStr) {
        SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
        Date beginDate = null;
        Date endDate = null;
        Calendar beginGC = null;
        Calendar endGC = null;
        List<String> list = new ArrayList<String>();
        try {
            beginDate = f.parse(beginDateStr);
            endDate = f.parse(endDateStr);
            beginGC = Calendar.getInstance();
            beginGC.setTime(beginDate);
            endGC = Calendar.getInstance();
            endGC.setTime(endDate);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            while (beginGC.getTime().compareTo(endGC.getTime()) <= 0) {
                int week = getWeek(beginGC.getTime());
                if ( week == 1 || week == 7) {
                    list.add(sdf.format(beginGC.getTime()));
                }
                beginGC.add(Calendar.DAY_OF_MONTH, 1);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
	
	public static int getWeek(Date date){
        Calendar c = new GregorianCalendar();
        c.setTime(date);
        int weekInt = c.get(Calendar.DAY_OF_WEEK);
        return weekInt;
    }
	
	/**
	 * 获取台湾学校上课天数
	 * ~~台湾是我国不可分割的重要一部分,希望两岸人民一家亲,早日回归祖国怀抱~~
	 * @param schoolId 学校id
	 * @param dateValue 日期区间【2018-01-01~2018-12-31】
	 * @param dateStuts 日期状态
	 * @return 应出席天数
	 * @throws ParseException 
	 */
	public static int workDay(String dateValue,String dateStuts,String schoolId) throws ParseException {
		List<String> list = new ArrayList<String>();//假定放假日期
		list.add("2019-05-01");
		list.add("2019-04-06");//周六
		list.add("2019-04-07");//周日
		list.add("2019-03-08");
		if("day".equals(dateStuts)) {
			//先判断是否是台湾地区规定假日,或学校放假日,再判断是否是周六周日
			//List<String> list = this.leaveRefundDao.getHolidaysFromSchoolSchedule(dateValue, dateValue, schoolId);
			if(list != null && !list.isEmpty()) {
				return 1;
			} else {
				if(isWeekend(dateValue)) {
					return 0;
				} else {
					return 1;
				}
			}
		} else {
			String dateFrom = dateValue.split("~")[0];
			String dateTo = dateValue.split("~")[1];
			if(dateFrom.equals(dateTo)) {
				//先判断是否是台湾地区规定假日,或学校放假日,再判断是否是周六周日
				//List<String> list = this.leaveRefundDao.getHolidaysFromSchoolSchedule(dateFrom, dateFrom, schoolId);
				if(list != null && !list.isEmpty()) {
					return 1;
				} else {
					if(isWeekend(dateFrom)) {
						return 0;
					} else {
						return 1;
						
					}
				}
			} else {
				//获取时间区间总天数
				List<String> days = getDayListOfDate(dateFrom, dateTo);
			    //获取时间区间内学校放假日期
			    //List<String> holidays =leaveRefundDao.getHolidaysFromSchoolSchedule(dateFrom,dateTo,schoolId);
			    //获取时间区间内的周六周日日期
			    List<String> weekends = getWeekendListOfDate(dateFrom, dateTo);
			    //利用HashSet的特性去重
			    Set<String> holidaySet = new HashSet<String>();//得到所有的假期
		        holidaySet.addAll(list);
		        holidaySet.addAll(weekends);
		        Iterator<String> iterator = holidaySet.iterator();
				while (iterator.hasNext()) {
					System.out.println(iterator.next());			
				}
				return 0;
			}
		}
	}
	
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算两个日期的相差天数可以使用Java 8中的java.time包中的Period类。而去除工作日可以使用Java 8中的java.time.temporal.TemporalAdjusters类和java.time.DayOfWeek枚举类来实现。 示例代码如下: ```java import java.time.LocalDate; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAdjusters; import java.time.DayOfWeek; public class DateDiffWithoutWeekend { public static void main(String[] args) { LocalDate startDate = LocalDate.of(2021, 1, 1); LocalDate endDate = LocalDate.of(2021, 1, 10); long days = ChronoUnit.DAYS.between(startDate, endDate); // 去除周末 int weekends = 0; LocalDate date = startDate; while (date.isBefore(endDate)) { if (date.getDayOfWeek() == DayOfWeek.SATURDAY || date.getDayOfWeek() == DayOfWeek.SUNDAY) { weekends++; } date = date.with(TemporalAdjusters.next(DayOfWeek.MONDAY)); } long workingDays = days - weekends; System.out.println("相差天数(不去除周末):" + days); System.out.println("相差天数(去除周末):" + workingDays); } } ``` 在代码中,我们首先使用LocalDate类创建开始日期和结束日期,然后使用ChronoUnit类的DAYS字段计算它们之间的天数。 接下来,我们使用while循环和TemporalAdjusters类的next()方法来遍历开始日期和结束日期之间的所有周一,并在每个周末(即周六和周日)增加计数器。最后,我们将周末的计数器从总天数中减去,得到去除周末后的工作日天数。 注意:本代码仅适用于计算两个日期之间的天数,如果需要计算工作日的小时数或分钟数,则需要进行更复杂的计算

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值