【Java】判断是否是工作日、计算工期(去除周末)
这里主要是通过java util包中的Calendar,来判断是否是工作日、计算工期(去除周末)
/**
* @ Author:yl1794
* @ Date:2019/10/14 16:03
* @ Description:
*/
public class DateCountUtil {
public static final long milliOfDay = 86400 * 1000;
/**
* 递归:计算开始时间
* 防止因期望开始时间在非工作日,而经过逆推导致最终开始时间在参考时间之前的问题
*
* 该场景主要是用于有任务与前置任务的关系。假设A是B的前置任务,则B的开始时间必须在A的截止时间之后。
* 若A的截止时间为星期六(referenceTime),那么B的期望开始时间为星期日,由于不是工作日则会往前推,一直推到星期五。
* 该时间不满足前提,B的正确开始时间应该是下周一。
*
* @param startTime 期望开始时间
* @param referenceTime 参考时间
* @return 正确开始时间
*/
public static long calculationStartTime(long startTime, long referenceTime){
long startTimeNew = DateCountUtil.countTime(startTime, true);
// 期望开始时间必须在参考时间之后
if(startTimeNew > referenceTime){
return startTimeNew;
}
return calculationStartTime(startTime + DateCountUtil.milliOfDay, referenceTime);
}
/**
* 根据开始时间和工期计算截止时间(扣除周末)
*
* @param startTime 开始时间
* @param period 工期
* @return 截止时间
*/
public static long calculationEndTime(long startTime, int period) {
JDateTime endTime = new JDateTime(startTime).addDay(1).subMillisecond(1);
// 遍历工期,判断每天是否是周末
for (int i = period - 1; i > 0; i--) {
endTime = endTime.addDay(1);
int dayOfWeek = endTime.getDayOfWeek();
// 如果是周末,则直接跳到周一
if (dayOfWeek > 5) {
endTime = endTime.addDay(7 - dayOfWeek + 1);
}
}
return endTime.getTimeInMillis();
}
/**
* 计算工期(扣除周末)
*
* @param startTime 开始时间
* @param endTime 截止时间
* @return 工期
*/
public static int countPeriod(long startTime, long endTime) {
int numberOfDays = 0;
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal1.setTimeInMillis(startTime);
cal2.setTimeInMillis(setEndOfDay(endTime));
while (cal1.before(cal2)) {
if ((Calendar.SATURDAY != cal1.get(Calendar.DAY_OF_WEEK)) && (Calendar.SUNDAY != cal1.get(Calendar.DAY_OF_WEEK))) {
numberOfDays++;
}
cal1.add(Calendar.DATE, 1);
}
return numberOfDays;
}
/**
* 计算时间。若是开始时间,则往前计算直至工作日;反之,往后计算。
*
* @param nowTime 时间
* @param isStartTime 是否是开始时间
* @return 时间
*/
private static long countTime(long nowTime, boolean isStartTime) {
while (!isWeekday(nowTime)) {
nowTime = isStartTime ? nowTime - milliOfDay : nowTime + milliOfDay;
}
return nowTime;
}
/**
* 校验某天是否是工作日
*
* @param date 日期
* @return true / false
*/
private static Boolean isWeekday(long date) {
if (isEmpty(date)) {
return false;
}
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(date);
return cal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && cal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY;
}
/**
* 将开始时间设置为该天的最开始
*
* @param startTime 日期
* @return 开始时间
*/
public static long setStartOfDay(long startTime) {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(startTime);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0); // 注意毫秒的影响
return cal.getTimeInMillis();
}
/**
* 将截止时间设置为该天的最晚
*
* @param endTime 日期
* @return 截止时间
*/
public static long setEndOfDay(long endTime) {
return setStartOfDay(endTime) + milliOfDay - 1;
}
}
版权声明:本文为Mr_EvanChen原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END