2016-12-16 19 views
1

我的問題是我需要知道有多少週末是2日期間以下的數量。 由於我對我的解決方案不滿意,我問了一下。我如何才能找到週末betwee 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

檢查開始和結束是週末,然後檢查其間週末他們的數量(以及如果兩個天都'> 5'否則,您不能有超過1個週末)。 – Rogue

+2

1)找到第一個日期的DOW。 2)找到第二個日期的DOW。 3)查找中間的天數。 3)我們知道一週有7天 - 應用數學。 –

+1

你能找到某一日期的一週嗎?如果是這樣,我認爲你只是找到兩者之間的絕對差異。顯然,跨越多個年度變得困難,但 –

回答

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是常數。不幸的是我找不到喬達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月2日星期五和2016-12-06星期二之間試過了。它給了2作爲答案。它應該是1. –

+0

@KlitosKyriacou爲什麼它應該是1?我計算2016-12-03和2016-12-04爲您兩個日期之間的週末天數。 – Aaron

+0

問題是有多少*週末*有兩天之間,而不是週末*天數*。 –

相關問題