2016-12-16 6 views
1

私の問題は次の通りです.2つの日付間の週末数を知る必要があります。 私の解決策に満足していないので、私は尋ねる。2日間の週末数を調べるにはどうすればいいですか

int numberOfWeekendContained(LocalDate start, LocalDate end) { 
    int weekends = 0; 
    for (LocalDate day = startTime.toLocalDate(); !day.isAfter(end); day = day.plusDays(1)) { 
     LocalDate previousDay = day.minusDays(1); 
     if (isWeekEnd(day) && (!isWeekEnd(previousDay) || !isInRange(previousDay, start, end))) { 
      weekends++; 
     } 
    } 
    return weekends; 
} 

private static boolean isWeekEnd(LocalDate day) { 
    return DayOfWeek.SATURDAY.equals(day.getDayOfWeek()) || DayOfWeek.SUNDAY.equals(day.getDayOfWeek()); 
} 

private static boolean isInRange(LocalDate day, LocalDate start, LocalDate end) { 
    return !day.isBefore(start) && !day.isAfter(end); 
} 

完全な週末としてカウントされます。私の範囲が日曜日から月曜日になるならば、私は週末が1つあります。日曜日から次の土曜日に行くと、2とカウントされます。

私の意見では一見して理解するのが難しい場合は本当に好きではありません。

このクリーナーの作り方は誰にも分かりますか?

+0

開始日と終了日が週末であるかどうかを確認し、それらの間の週末数をチェックします(2日間が '> 5'そうでなければ週末は1日を超えることはできません)。 – Rogue

+2

1)最初の日付のDOWを探します。 2)2番目の日付のDOWを探します。 3)間の日数を求めます。 3)週には7日間があることがわかります - 数学を適用します。 –

+1

日付が上がっている年の週を見つけることができますか?もしそうなら、私はあなたが2つの間に絶対的な違いがあると思うと思います。 –

答えて

0

お気軽にお寄せください。私はQuintiumのソリューションと一緒に行くと、私はそれがより明確だと思う。すなわち、

int numberOfWeekendContained(LocalDate startDate, LocalDate endDate) { 
    LocalDate start = startDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); 
    LocalDate end = endDate.with(TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY)); 
    return Period.between(start, end).getDays()/ DAYS_PER_WEEK; 
} 

DAY_PER_WEEK = 7は定数です。残念ながら私はJoda Daysを見つけることができませんでした.DAY_PER_WEEKはJava 8に相当します

2

私は、これはトリックを行うと思う:

public static int numberOfWeekendContained(LocalDate start, LocalDate end) { 
    LocalDate firstMondayAfterStart = start.plusDays(8-start.getDayOfWeek().getValue()); 
    LocalDate lastSundayBeforeEnd = end.minusDays(end.getDayOfWeek().getValue()); 

    int numberOfWeeksInbetween = Math.floorDiv(Period.between(firstMondayAfterStart, lastSundayBeforeEnd).getDays() + 1, 7); 

    return 
     Math.max(0, Math.min(2, 7 - start.getDayOfWeek().getValue())) +  // weekend days from the start week 
     Math.max(0, end.getDayOfWeek().getValue() - 5) +     // weekend days from the end week 
     numberOfWeeksInbetween * 2;           // weekend days from the weeks inbetween 

} 

あなたはhereそれを試すことができます。

+0

私は金2016-12-02と火2016-12-06の間で試しました。それは答えとして2を与えた。それは1になるはずです。 –

+0

@KlitosKyriacouなぜそれが1であるべきですか?私はあなたの2つの日付の間の週末日として2016-12-03と2016-12-04を数えます。 – Aaron

+0

質問は、週末*週の数ではなく、2週間の間に何週間*週末*でしたか。 –

関連する問題