如何实现根据当前的日期,来确定前一个工作日

本文讨论了如何在包含节假日的情况下计算前一个工作日的日期,通过避免陷入循环判断,提出了一种新的算法解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

业务场景一:
根据当前的日期判断前一个工作日是几号。
1),通常情况是:在周2到周6的这五天时间里,获取前一个工作日的方法是简单的,就是:proviousBusinessDate= CurrentDate -1;同理可以推导出:2) 周1是: proviousBusinessDate= CurrentDate - 3; 3)周日是:proviousBusinessDate= CurrentDate -2;
java代码的实现如下:

public static Date getPreviousBusinessDate(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);

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

if (dayOfWeek == Calendar.MONDAY) {
calendar.add(Calendar.DATE, -3);
} else if (dayOfWeek == Calendar.SUNDAY) {
calendar.add(Calendar.DATE, -2);
} else {
calendar.add(Calendar.DATE, -1);
}

return calendar.getTime();
}


业务场景二:
如果加入Holiday的情况,前一个工作日该如何确定。

现在情况有了变化,我们如果不仅仅要考虑周末休息天的情况,还要考虑holiday的节假日放假的场景的话,是否会有点不一样拟。
如果接着上面的思维:我们就会这样考虑:好了,我们不是根据当前的日期,拿到了前一个工作日了麽。那么我们就可以对这个日期再进行判断,如果previousBusinessDay是holiday的话,我们就再往前减一天,还是holiday就再减,一直到不是holiday为止(在这里holiday由一个holiday表来维护)。
代码就是:
if(holidayList.Contains(previousBusinessDay)){
previousBusinessDay = previousBusinessDay -1;
}

看到这个代码你是不是就看到bug了,这里有个问题是:当你减了很多天之后,你还是要再重新去判断你得到的这个日期是不是满足条件的,是不是在weekend里面,如果是在weekend里面的话,你得重新回去是周日周一及其他的情况。然后判断完了之后,你还得回来判断你是不是又回到了holiday.如此我们就陷入了一个死循环里面而无法自拔。

来吧,是时候跳出这个怪圈了。我们就不能换一种思路吗:
我们不管三七二十一先减一天,先拿到previousBusinessDay,然后再来判断我们拿到的这天是不是周末还是Holiday,如果是就减一,一直减直到减到不是为止。

show code:

/**
* get PreviousBusinessDate (exclude the holiday)
* @param date
* @param holidays
* @return
*/
public static Date getPreviousBusinessDate(Date date, List<Date> holidays) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, -1);
Date prevDate = cal.getTime();
//if the prevDate is Holiday, then get the day before prevDate.
while(isHoliday(prevDate, holidays) || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY){
cal.add(Calendar.DATE, -1);
prevDate = cal.getTime();
}

return prevDate;
}


/**
* if the current Date is Holiday, return true, otherwise, return false
* @return
*/
public static boolean isHoliday(Date currentDate, List<Date> holidays) {
boolean isHoliday = false;
for (Date date : holidays) {
if(DateUtils.isSameDay(date, currentDate)) {
isHoliday = true;
break;
};
}
return isHoliday;
}



如果有谁路过此地,能给出更好的算法,请一定show出来

----EOF----
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值