找到下一个工作日

假设我在我的数据库中存储了一堆假期。

我需要做的是找出下一个工作日,不包括星期六和数据库中定义的公众假期。

例如。

假设今天是2月15日星期五,17日和18日是公共假日,在数据库中定义为datetime。 所以现在当我按下下一个工作日的按钮时,应该会在2月19日返回。

获得它的最有效方法是什么?

最简单的。

步骤1:从数据库获取假期并格式化为您的格式,将其保存在List

第2步:创建一个添加日期的方法。

 public static Date addDays(Date d, int days) { Calendar cal = Calendar.getInstance(); cal.setTime(d); cal.add(Calendar.DATE, days); return cal.getTime(); } 

第3步:创建一个查找假期的方法。

 public boolean isBankHoliday(java.util.Date d) { Calendar c = new GregorianCalendar(); c.setTime(d); if((Calendar.SATURDAY == c.get(c.DAY_OF_WEEK)) || (Calendar.SUNDAY == c.get(c.DAY_OF_WEEK)) || bankHolidays.contains(dString)) { return (true); } else { return false; } } 

第4步:获取输入日期。 检查银行假日,循环直到找到工作日。

 while (isBankHoliday(myDate)) { myDate = addDays(myDate, 1); } 

只是将纯SQL解决方案抛入调音台:

 DECLARE @InDate DATETIME SET @InDate = '25/12/2011' ;WITH CTE ([Date]) AS ( SELECT DATEADD(DAY, 1, CAST(@InDate AS DATE)) [Date] UNION ALL SELECT DATEADD(DAY, 1, [Date]) FROM CTE WHERE [Date] IN (SELECT [Date] FROM YourHolidayTable) OR DATENAME(WEEKDAY, [Date]) IN ('Saturday', 'Sunday') ) SELECT MAX([Date]) [NextWorkingDay] FROM CTE 

您可以使用DateCalculator和Joda (可选)来实现此目的。 在下面的示例中,假日存储在Set中,并使用moveByBusinessDays -method。

 import java.util.HashSet; import junit.framework.Assert; import net.objectlab.kit.datecalc.common.DateCalculator; import net.objectlab.kit.datecalc.common.DefaultHolidayCalendar; import net.objectlab.kit.datecalc.common.HolidayHandlerType; import net.objectlab.kit.datecalc.joda.LocalDateKitCalculatorsFactory; import org.joda.time.LocalDate; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; public class NextBusinessDayTest { private DateCalculator dateCalculator; private final LocalDate startDate = new LocalDate(2012, 2, 9); // Thursday @BeforeSuite public void setUp() { HashSet holidays = new HashSet(); holidays.add(new LocalDate(2012, 2, 10)); // Friday holidays.add(new LocalDate(2012, 2, 14)); // Tuesday DefaultHolidayCalendar holidayCalendar = new DefaultHolidayCalendar(holidays); LocalDateKitCalculatorsFactory.getDefaultInstance().registerHolidays("holidays", holidayCalendar); dateCalculator = LocalDateKitCalculatorsFactory.getDefaultInstance().getDateCalculator("holidays", HolidayHandlerType.FORWARD); } @Test public void testNextBusinessDay() { dateCalculator.setStartDate(startDate); Assert.assertEquals(dateCalculator.moveByBusinessDays(1).getCurrentBusinessDate(), new LocalDate(2012, 2, 13)); // skips the 10th (holiday), 11th and 12th (weekend) dateCalculator.setStartDate(startDate); Assert.assertEquals(dateCalculator.moveByBusinessDays(2).getCurrentBusinessDate(), new LocalDate(2012, 2, 15)); // also skips the 14th (holiday) } } 

编辑:

  1. 还有一个日期计算器库的替代版本,不需要Joda。
  2. 如果库提供了其他function,请检查在您的应用程序中是否有用。 如果找到下一个工作日是唯一的用例,那么自己编写方法将是更好的选择。 Vanathi很好地描述了基本方法。

我不知道你是否在Java中内置了可以执行此操作的函数,但是如果不这样做:

在我的头顶 –

最简单的可能是存储哪些日子是周末以及公众假期? 或者,如果你有一个参考点(比如2012年1月1日),那么你可以存储当时的哪一天,并在计算新值时使用mod 7算法?