From: PJ Fanning Date: Thu, 10 Feb 2022 23:09:10 +0000 (+0000) Subject: refactor workday code X-Git-Tag: REL_5_2_1~90 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=8a6966999ab18477aa7c115cc3bd82a5dc84ae61;p=poi.git refactor workday code git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1897950 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayCalculator.java b/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayCalculator.java index f6293f5e20..98988b5be4 100644 --- a/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayCalculator.java +++ b/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayCalculator.java @@ -17,8 +17,11 @@ package org.apache.poi.ss.formula.atp; +import java.util.Arrays; import java.util.Calendar; import java.util.Date; +import java.util.HashSet; +import java.util.Set; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.util.LocaleUtil; @@ -30,6 +33,35 @@ import org.apache.poi.util.Removal; public class WorkdayCalculator { public static final WorkdayCalculator instance = new WorkdayCalculator(); + private static final Set standardWeekend = + new HashSet<>(Arrays.asList(new Integer[]{Calendar.SATURDAY, Calendar.SUNDAY})); + private static final Set sunMonWeekend = + new HashSet<>(Arrays.asList(new Integer[]{Calendar.SUNDAY, Calendar.MONDAY})); + private static final Set monTuesWeekend = + new HashSet<>(Arrays.asList(new Integer[]{Calendar.MONDAY, Calendar.TUESDAY})); + private static final Set tuesWedsWeekend = + new HashSet<>(Arrays.asList(new Integer[]{Calendar.TUESDAY, Calendar.WEDNESDAY})); + private static final Set wedsThursWeekend = + new HashSet<>(Arrays.asList(new Integer[]{Calendar.WEDNESDAY, Calendar.THURSDAY})); + private static final Set thursFriWeekend = + new HashSet<>(Arrays.asList(new Integer[]{Calendar.THURSDAY, Calendar.FRIDAY})); + private static final Set friSatWeekend = + new HashSet<>(Arrays.asList(new Integer[]{Calendar.FRIDAY, Calendar.SATURDAY})); + private static final Set monWeekend = + new HashSet<>(Arrays.asList(new Integer[]{Calendar.MONDAY})); + private static final Set tuesWeekend = + new HashSet<>(Arrays.asList(new Integer[]{Calendar.TUESDAY})); + private static final Set wedsWeekend = + new HashSet<>(Arrays.asList(new Integer[]{Calendar.WEDNESDAY})); + private static final Set thursWeekend = + new HashSet<>(Arrays.asList(new Integer[]{Calendar.THURSDAY})); + private static final Set friWeekend = + new HashSet<>(Arrays.asList(new Integer[]{Calendar.FRIDAY})); + private static final Set satWeekend = + new HashSet<>(Arrays.asList(new Integer[]{Calendar.SATURDAY})); + private static final Set sunWeekend = + new HashSet<>(Arrays.asList(new Integer[]{Calendar.SUNDAY})); + /** * Constructor. */ @@ -46,10 +78,12 @@ public class WorkdayCalculator { * @return number of workdays between start and end dates, including both dates. */ public int calculateWorkdays(double start, double end, double[] holidays) { - int saturdaysPast = this.pastDaysOfWeek(start, end, Calendar.SATURDAY); - int sundaysPast = this.pastDaysOfWeek(start, end, Calendar.SUNDAY); + Integer[] weekendDays = new Integer[standardWeekend.size()]; + weekendDays = standardWeekend.toArray(weekendDays); + int weekendDay1Past = weekendDays.length == 0 ? 0 : this.pastDaysOfWeek(start, end, weekendDays[0]); + int weekendDay2Past = weekendDays.length <= 1 ? 0 : this.pastDaysOfWeek(start, end, weekendDays[1]); int nonWeekendHolidays = this.calculateNonWeekendHolidays(start, end, holidays); - return (int) (end - start + 1) - saturdaysPast - sundaysPast - nonWeekendHolidays; + return (int) (end - start + 1) - weekendDay1Past - weekendDay2Past - nonWeekendHolidays; } /** @@ -131,8 +165,11 @@ public class WorkdayCalculator { } private boolean isWeekend(Calendar date) { - return date.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY - && date.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY; + return isWeekend(date, standardWeekend); + } + + private boolean isWeekend(Calendar date, Set weekendDays) { + return weekendDays.contains(date.get(Calendar.DAY_OF_WEEK)); } /**