假设我在我的数据库中存储了一堆假期。
我需要做的是找出下一个工作日,不包括星期六和数据库中定义的公众假期。
例如
假设今天是2月15日星期五,17日和18日是公众假期,在数据库中定义为datetime。所以,现在当我按下下一个工作日的按钮时,它应该会在2月19日返回。
获得它的最有效方法是什么?
答案 0 :(得分:10)
简单的。
第1步:从数据库中获取假期并格式化为您的格式,并将其保存在List<String>
第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);
}
答案 1 :(得分:3)
您可以使用DateCalculator和Joda(可选)来实现此目的。在下面的示例中,假日存储在一个集合中,并使用moveByBusinessDays
- 方法。
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<LocalDate> dateCalculator;
private final LocalDate startDate = new LocalDate(2012, 2, 9); // Thursday
@BeforeSuite
public void setUp() {
HashSet<LocalDate> holidays = new HashSet<LocalDate>();
holidays.add(new LocalDate(2012, 2, 10)); // Friday
holidays.add(new LocalDate(2012, 2, 14)); // Tuesday
DefaultHolidayCalendar<LocalDate> holidayCalendar = new DefaultHolidayCalendar<LocalDate>(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)
}
}
修改强> 的
答案 2 :(得分:3)
将纯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
答案 3 :(得分:0)
我不知道您是否使用Java内置了可以执行此操作的函数,但万一您不知道:
脱离我的头顶 -
最简单的可能是存储哪些日子是周末以及公众假期? 或者,如果你有一个参考点(比如2012年1月1日)那么你可以存储它当周的哪一天,并在计算新值时使用mod 7算法?