2016-12-16 54 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

问题是有多少*周末*有两天之间,而不是周末*天数*。 –