指定された2つの日付の間の営業日数を計算する必要があります
私は休暇のリストをユーザーから提供された配列リストとして持っています。
は、だから私は日付の間のそれぞれと毎日を調査し、その曜日及びません(正常に動作している)私は、以下の提供されたコードのような連邦休日かどうかを確認2つの日付間の営業日数を計算します
しかし、これは非常に高価であることができ、12回の連邦休日を言うことができますし、毎週私は週末でないことを確認する必要があります
もし私が5年の間に数える必要があれば、365 * 5 * 12の21,000回の反復が必要です!そのクレイジー(営業日の計算も含まれません)
良い方法はありますか?
package test;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang3.time.DateUtils;
public class TestDiff {
public static void main(String[] args) throws ParseException {
DateFormat formatter = new SimpleDateFormat("MM/dd/yy");
// add 4 years as an example
Date fromDate = formatter.parse("11/06/2017"),toDate = formatter.parse("11/29/2017");// DateUtils.addDays(fromDate,365 * 4);
int numberOfDaysCount=0;
int daysBetween = daysBetween(fromDate,toDate);
Date caurDate = fromDate;
for(int i=0;i<=daysBetween ; i++) {
if(isWeekDay(caurDate) && !isFederalHoliday(caurDate))
numberOfDaysCount++;
caurDate = DateUtils.addDays(caurDate,1); // add one day
}
System.out.println("number of business days between "+fromDate+" and "+toDate+" is: "+numberOfDaysCount);
}
private static boolean isWeekDay(Date caurDate) {
Calendar c = Calendar.getInstance();
c.setTime(caurDate);
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
return dayOfWeek!= Calendar.SATURDAY && dayOfWeek!= Calendar.SUNDAY ;
}
private static boolean isFederalHoliday(Date caurDate) throws ParseException {
DateFormat formatter = new SimpleDateFormat("MM/dd/yy"); //list will come from dao.getFederalHoliday();
List<Date> federalHolidays = Arrays.asList(formatter.parse("01/02/2017"),formatter.parse("01/16/2017"),formatter.parse("02/20/2017"),formatter.parse("05/29/2017"),formatter.parse("07/04/2017"),formatter.parse("09/04/2017"),formatter.parse("10/09/2017"),formatter.parse("07/04/2017"),formatter.parse("11/10/2017"),formatter.parse("11/23/2017"),formatter.parse("12/25/2017"));
for (Date holiday : federalHolidays) {
if(DateUtils.isSameDay(caurDate,holiday)) //using Apache commons-lang
return true;
}
return false;
}
public static int daysBetween(Date d1, Date d2){
return (int)((d2.getTime() - d1.getTime())/(1000 * 60 * 60 * 24));
}
}
これは何のループを使用していないため、指数関数的にランタイムで高い取得していないとして、私は考えていない、あなたに役立つかもしれない:https://stackoverflow.com/a/4600534/1932789 – zack6849
同様質問が何度か尋ねられています。あなたは見ましたか?私はこれが正確な複製であると確信していると言っているわけではありませんが、検索するとインスピレーションを得ることができます。 –
[Javaで2つの異なる日付の間の作業(週末を除く)の日数を計算する方法]をご覧ください(https://stackoverflow.com/questions/32758569/how-to-calculate-weeks-execluding-weekends- 2日間の差異 - d) [週末のJavaを除く2つの日付間の日数を計算する方法](https://stackoverflow.com/questions/18354727/how-to-calculate-number-of-days-between-two-dates-excluding-weekend-java ); [Javaの2つの日付の間の平日の数を計算する](https://stackoverflow.com/questions/4600034/calculate-number-of-weekdays-between-two-dates-in-java) –