2013-08-28 78 views
1

我有兩個Date對象,開始和結束。我想每週迭代它們,也就是說,如果它們之間恰好有4周(日曆周,而不僅僅是7天之後),我需要4次迭代,並且在每次迭代中,我都希望得到實際的開始和結束日期。開始,結束日期之間的所有星期迭代

我目前正在破解一個Iterable,但我想如果它可以輕鬆實現,例如喬達時間或一個聰明的自定義方法。 在此先感謝!

編輯:我必須重申,我需要幾周在日曆中,而不是七天後彼此。如果我的開始日期是在一週的任意一天(例如星期五),我的第一次迭代應該包含[星期五,星期日]而不是[星期五,星期五+ 7天]。解決方案發布爲答案。

+0

你在這裏有什麼問題? –

+0

問題是,如何在Java中實現這一點。 – gyorgyabraham

+0

好的。你可以請一個例子解釋一下,這樣會更清楚。 –

回答

0

感謝大家,這是一個能夠滿足我的要求的工作解決方案(請注意,在大多數情況下添加7天到大多數情況下都不會產生日曆周,只有當它是星期一!) 此代碼使用Joda Time API 。

private static List<Interval> getWeeks(final DateTime start, final DateTime finish) 
{ 
    final int weekLeaps = Weeks.weeksBetween(start, finish).getWeeks(); 
    if (weekLeaps == 0) { 
     return ImmutableList.of(new Interval(start, finish)); 
    } else { 
     // We hop sundays at least once 
     final ImmutableList.Builder<Interval> resBuild = ImmutableList.<Interval> builder(); 

     // First week 
     DateTime wStart = start; 
     DateTime wEnd = rollToWeekEnd(start); 
     resBuild.add(new Interval(wStart, wEnd)); 

     // Other weeks 
     for (int i = 0; i < weekLeaps; i++) { 
      wStart = wEnd.plusSeconds(1); 
      DateTime actWeekEnd = rollToWeekEnd(wStart); 
      wEnd = actWeekEnd.isBefore(finish) ? actWeekEnd : finish; 
      resBuild.add(new Interval(wStart, wEnd)); 
     } 

     return resBuild.build(); 
    } 
} 

private static DateTime rollToWeekEnd(final DateTime from) 
{ 
    return from.withDayOfWeek(DateTimeConstants.SUNDAY) 
     .withHourOfDay(23) 
     .withMinuteOfHour(59) 
     .withSecondOfMinute(59) 
     .withMillisOfSecond(0); 
} 
0

要計算使用日曆和WEEK_OF_YEAR:

int startWeek; 
int finishWeek; 
int diff; 
SimpleDateFormat sdf; 
Calendar cal; 
Calendar startCountingCal; 
Date startDate; 
Date finishDate; 
String startDateS = "01/01/2013"; 
String finishDateS = "01/05/2013"; 

sdf = new SimpleDateFormat("dd/MM/yyyy"); 

startDate = sdf.parse(startDateS); 
finishDate = sdf.parse(finishDateS); 

cal = Calendar.getInstance(); 

cal.setTime(startDate); 
startWeek = cal.get(Calendar.WEEK_OF_YEAR);  

cal.setTime(finishDate); 
finishWeek = cal.get(Calendar.WEEK_OF_YEAR); 

diff = finishWeek - startWeek; 

startCountingCal = Calendar.getInstance(); 
startCountingCal.setTime(startDate); 

for (int i = 0; i < diff; i++) { 

    if (i==0) { 
     System.out.println("WEEK " + i + " start: " + sdf.format(startCountingCal.getTime())); 
     startCountingCal.add(Calendar.DATE, 7); 
     System.out.println("WEEK " + i + " start: " + sdf.format(startCountingCal.getTime())); 
    } else { 
     System.out.println("WEEK " + i + " start: " + sdf.format(startCountingCal.getTime())); 
     startCountingCal.add(Calendar.DATE, 7); 
     System.out.println("WEEK " + i + " start: " + sdf.format(startCountingCal.getTime())); 
    } 

} 

輸出:

WEEK 0 start: 01/01/2013 
WEEK 0 start: 08/01/2013 
WEEK 1 start: 08/01/2013 
WEEK 1 start: 15/01/2013 
WEEK 2 start: 15/01/2013 
WEEK 2 start: 22/01/2013 
WEEK 3 start: 22/01/2013 
WEEK 3 start: 29/01/2013 
.... 
etc. 

希望它能幫助!

+0

謝謝,但你轉發7天,而不是在日曆中的星期。如果我的開始日期不是星期一,但例如星期六,我的第一次迭代應該只持續兩天(星期六至星期日),而不是七天。如果您在日曆中隨機選擇一天併爲其添加7天,那麼您有一點獲得週一至週日的有效機會。我會準備一些代碼,現在在這裏添加它。 – gyorgyabraham

+0

此外,如果範圍與某年重疊,則使用Calendar.WEEK_OF_YEAR可能會混淆輸出。假如你使用它,並且你需要12月的最後一週到1月的第一個星期之間的幾周,那麼你會得到51周,但實際上是1周。 – gyorgyabraham

0

在Java 9中有一個不錯的LocalDate.datesUntil方法。使用TemporalAdjusters還可以在一週內調整時間。

int numOfWeeks = 4; 

    // First iteration with alignment 
    LocalDate start = LocalDate.now(); 
    LocalDate endOfTheFirstWeek = start.with(TemporalAdjusters.next(DayOfWeek.MONDAY)); 
    out.println(String.format("[%s,%s]", start, endOfTheFirstWeek)); 

    // Remaining iterations 
    endOfTheFirstWeek 
      .datesUntil(endOfTheFirstWeek.plusWeeks(numOfWeeks - 1), Period.ofWeeks(1)) 
      .forEach(it -> { 
       LocalDate from = it.plusDays(1); 
       LocalDate to = from.plusWeeks(1); 
       out.println(String.format("[%s,%s]", from, to)); 
      }); 
相關問題