週末を無視して、2 つの特定の時間インスタンス間の分数を取得しようとしています。これは私がやったことです。
public static final List<Integer> NON_WORKING_DAYS;
static {
List<Integer> nonWorkingDays = new ArrayList<Integer>();
nonWorkingDays.add(Calendar.SATURDAY);
nonWorkingDays.add(Calendar.SUNDAY);
NON_WORKING_DAYS = Collections.unmodifiableList(nonWorkingDays);
}
public static int getMinsBetween(Date d1, Date d2, boolean onlyBusinessDays)
{
int minsBetween = (int)((d2.getTime() - d1.getTime()) / (1000 * 60));
int minsToSubtract = 0;
if(onlyBusinessDays){
Calendar dateToCheck = Calendar.getInstance();
dateToCheck.setTime(d1);
Calendar dateToCompare = Calendar.getInstance();
dateToCompare.setTime(d2);
//moving the first day of the week to Tues so that a Sat, sun and mon fall in the same week, easy to adjust dates
dateToCheck.setFirstDayOfWeek(Calendar.TUESDAY);
dateToCompare.setFirstDayOfWeek(Calendar.TUESDAY);
//moving the dates out of weekends
if(!isBusinessDay(dateToCheck, NON_WORKING_DAYS)){
dateToCheck.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
dateToCheck.set(Calendar.HOUR, 0);
dateToCheck.set(Calendar.MINUTE, 0);
dateToCheck.set(Calendar.SECOND, 0);
dateToCheck.set(Calendar.MILLISECOND, 0);
}
if(!isBusinessDay(dateToCompare, NON_WORKING_DAYS)){
dateToCompare.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
dateToCompare.set(Calendar.HOUR, 0);
dateToCompare.set(Calendar.MINUTE, 0);
dateToCompare.set(Calendar.SECOND, 0);
dateToCompare.set(Calendar.MILLISECOND, 0);
}
for(; dateToCheck.getTimeInMillis() < dateToCompare.getTimeInMillis() ; dateToCheck.add(Calendar.DAY_OF_MONTH, 1)){
if(isBusinessDay(dateToCheck, NON_WORKING_DAYS)){
minsToSubtract = minsToSubtract + 1440;
}
}
minsBetween = minsBetween - minsToSubtract;
}
return minsBetween;
}
private static boolean isBusinessDay(Calendar dateToCheck, List<Integer> daysToExclude){
for(Integer dayToExclude : daysToExclude){
if(dayToExclude != null && dayToExclude == dateToCheck.get(Calendar.DAY_OF_WEEK)) {
return true;
}
else continue;
}
return false;
}
私の論理が正しいかどうか、そうでない場合はどうすればよいか教えてもらえますか? 週末に月が変わると、このコードがどのように動作するかはよくわかりません。
一部のテスト ケースで期待される出力:
- 金曜日の午後 6 時、月曜日の午前 6 時 - 12 時間以内に戻る必要があります
- 土曜日の午後 12 時、日曜日の午後 12 時 - 0 時間を返す必要があります
- 土曜日の午後 12 時、月曜日の午前 6 時 - 6 時間を返す必要があります