业务场景一:
根据当前的日期判断前一个工作日是几号。
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----
分享到:
相关推荐
本文将详细介绍如何使用C#语言来计算两个指定日期之间的实际工作日天数,并通过示例代码来展示具体的实现过程。 #### 一、基本概念 在开始编写代码之前,我们需要理解几个关键概念: 1. **工作日**:通常情况下,...
一个简单的方法是通过创建一个包含所有公休日(如新年、春节、国庆等)的表,然后查询这个表以确定下一个非节假日的工作日。下面是一个可能的表结构: ```sql CREATE TABLE holidays ( holiday_date DATE PRIMARY ...
下面详细解释了如何实现一个SQL函数来计算两个日期之间的有效工作日数量,仅排除周末。 ```sql USE [UnderWritting] GO /****** Object: UserDefinedFunction [dbo].[fn_WorkDay] ScriptDate: 02/20/2013 17:32:07 ...
- 判断当前日期是否为星期日,如果是则累加非工作日数量。 - 统计遍历的总天数,并从中减去非工作日的数量,即得到工作日数量。 #### 三、详细代码分析 **1. sunday 函数** - **闰年判断**: - 闰年的条件是:...
S7-SCL 是一种专门设计的工具,它可以帮助用户根据给定的日期或 CPU 硬件时钟的当前日期来确定日历日和日历周。此工具主要应用于 SIMATIC S7-300/S7-400 PLC 系统,通过 STEP 7 软件进行编程。本篇将详细介绍 S7-SCL...
本案例即来源于一个决策表,其目的是编写一个`NextDate()`函数,该函数接收一个日期(年、月、日)作为输入,并返回输入日期的下一天。该函数使用C语言编写,旨在通过具体实现加深对日期处理和逻辑控制的理解。 ###...
标题“Oracle 获取某日期属于一年中的第几个自然周”指的是在Oracle数据库系统中,通过SQL查询来确定一个特定日期在当年是第几周的问题。在实际业务中,这样的功能可能用于统计、报告或者数据分析,例如,公司可能...
你可以创建一个包含所有公共节假日的表,并使用`JOIN`操作与日期表合并,来确定哪些日期是节假日。对于工作日,可能需要考虑周末和特定的非工作日,这可能需要更复杂的逻辑,如使用`CASE`语句进行条件判断。 5. **...
如果当前日期是2005年6月21日,此命令将返回一个负数,表示从2005年11月12日到当前日期的月份数。 ### 五、Next_day:查找下一个工作日 `Next_day`函数用于返回在指定日期之后的第一个工作日的日期,这在安排会议...
在这里,我们需要输入一个与当前日期相比较的公式。输入“=A1=TODAY()”,其中A1是你的日期单元格。确保公式正确无误,因为我们需要它检查当前单元格的日期是否等于系统日期。 5. **设置格式**:点击“格式”按钮,...
这种方法可以让用户在不需要手动输入日期的情况下,自动获取当前日期或指定日期,从而提高工作效率和避免日期输入错误。 在Excel中,有多种方法可以实现自动日期设置,以下是其中一些常用的方法: 1. 使用TODAY()...
在浏览器中显示当前日期和时间是网页开发中的一个常见需求,这不仅可以增加网站的交互性,也可以为用户提供便利。本文介绍了一种使用JavaScript实现该功能的方法,并提供了一个具体的实例。该实例包括了如何操作时间...
这里我们创建了一个日期字段,初始值为当前日期。当用户选择日期并点击"确定"按钮时,会在控制台打印所选日期,并关闭窗口。 为了增强用户体验,我们可以进一步自定义这个日期选择窗口,例如添加日期范围限制、格式...
例如,计算两个日期间的工作日数量、确定一个日期所在的季度或者判断某个特定的日期是否存在(如情人节)。这些操作在编写涉及日期的SQL查询时非常常见,并且有助于完成各种复杂的业务逻辑。 最后,文章还提到了在...
WEEKNUM 函数的语法为 WEEKNUM(serial_number,[return_type]),其中 serial_number 代表日期,return_type 是一个数字,用于确定星期计算从哪一天开始。如果数字为 1,则说明一周开始于星期日,如果数字为 2,则说明...
2. **倒计时功能**:用户可以设定一个未来的日期,程序会实时显示距离该日期还有多少天,这对于期待重要事件如生日、纪念日或会议日期的人来说非常有用。 3. **日期加减法**:用户可以直接在当前日期上增加或减少...
计算年龄通常涉及到从当前日期减去出生日期,并得到年份差值。下面是一个简单的示例代码: ```java SimpleDateFormat sdf = new SimpleDateFormat("yyyy"); String currentYear = sdf.format(new Date()); int ...
例如,如果工作日是每天8小时,那么可以根据设定的工作时间和休息时间来计算这段时间内实际的工作小时数。 总结起来,计算某时间段内的工作日及时间涉及以下关键点: 1. 日期和时间的处理,包括添加、减去、格式化...
这里`startMonth`初始化为当月的第一天,然后通过添加一个月并减去一天来得到当月的最后一天。 ### 计算本季度的起始与结束日期 对于本季度的起始和结束日期,首先需要确定当前月份所属的季度,然后据此计算出季度...
以下是一个易语言实现的示例源码: ```易语言 .定义日期型 本周开始日期,本周结束日期 .定义整数型 当前星期 .取当前日期 当前日期 .取星期 当前日期,当前星期 .如果 当前星期 = 7 .赋值 本周开始日期,当前...