gpt4 book ai didi

java - 计算包括假期在内的工作日

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:42:54 47 4
gpt4 key购买 nike

我需要计算两个日期之间的工作日。例如:我们在 7 月 4 日(在美国)放假。所以如果我的日期是日期 1 = 07/03/2012date2 = 07/06/2012

由于 7 月 4 日是假期,因此这些日期的工作日数应为 1。

我有下面的方法来计算工作日,它只计算周末而不计算假期。还有什么方法可以计算假期....请帮助我。

  public static int getWorkingDaysBetweenTwoDates(Date startDate, Date endDate) {  
Calendar startCal;
Calendar endCal;
startCal = Calendar.getInstance();
startCal.setTime(startDate);
endCal = Calendar.getInstance();
endCal.setTime(endDate);
int workDays = 0;

//Return 0 if start and end are the same
if (startCal.getTimeInMillis() == endCal.getTimeInMillis()) {
return 0;
}

if (startCal.getTimeInMillis() > endCal.getTimeInMillis()) {
startCal.setTime(endDate);
endCal.setTime(startDate);
}

do {
startCal.add(Calendar.DAY_OF_MONTH, 1);
if (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY
&& startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) {
++workDays;
}
} while (startCal.getTimeInMillis() < endCal.getTimeInMillis());

return workDays;
}

最佳答案

由于接受的答案仍然使用过时的 Calendar类 – 这是我使用 java.time 中提供的更新的 Java 日期和时间 API 的两分钱包。

您必须从某个地方获取假期的日期,没有标准的 Java 库。无论如何,这太本地化了,因为假期在很大程度上取决于您所在的国家和地区(圣诞节或复活节等广为人知的假期除外)。
例如,您可以从假期 API 获取它们。在下面的代码中,我将它们硬编码为 Set。的 LocalDate

Java 9

LocalDate startDate = LocalDate.of(2012, 3, 7);
LocalDate endDate = LocalDate.of(2012, 6, 7);

// I've hardcoded the holidays as LocalDates
// and put them in a Set
final Set<LocalDate> holidays = Set.of(
LocalDate.of(2018, 7, 4)
);
// For the sake of efficiency, I also put the business days into a Set.
// In general, a Set has a better lookup speed than a List.
final Set<DayOfWeek> businessDays = Set.of(
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY
);

List<LocalDate> allDates =

// Java 9 provides a method to return a stream with dates from the
// startdate to the given end date. Note that the end date itself is
// NOT included.
startDate.datesUntil(endDate)

// Retain all business days. Use static imports from
// java.time.DayOfWeek.*
.filter(t -> businessDays.contains(t.getDayOfWeek()))

// Retain only dates not present in our holidays list
.filter(t -> !holidays.contains(t))

// Collect them into a List. If you only need to know the number of
// dates, you can also use .count()
.collect(Collectors.toList());

Java 8

方法LocalDate.datesUntil在 Java 8 中不可用,因此您必须以不同的方式获取这两个日期之间的所有日期的流。我们必须首先计算使用 ChronoUnit.DAYS.between 之间的总天数方法。

long numOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate);

然后我们必须生成一个与开始日期和结束日期之间的天数一样长的整数序列,然后创建LocalDate。从它开始,从开始日期开始。

IntStream.iterate(0, i -> i + 1)
.limit(numOfDaysBetween)
.mapToObj(startDate::plusDays)

现在我们有一个 Stream<LocalDate> ,然后您可以使用 Java 9 代码的剩余部分。您还需要替换 Set.of() 的用法,因为它在 Java 8 中不可用。可能是 new HashSet<>(Arrays.asList(MONDAY...FRIDAY)) .

关于java - 计算包括假期在内的工作日,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10854119/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com