2013-01-25 3 views
2

다음은 주어진 달의 시작일과 종료일을 계산하는 데 사용하는 코드입니다. 주 시작일은 MONDAY이고 주말 종료일은 SUNDAY라고 가정합니다. 예를 들어, 2013 년 1 월에는 5 주가 소요됩니다. 달이 일요일로 시작하는 경우 - 셋째 주 (13) - 1 월 2013 07 - 1 월 2013 - 06 월 2013 둘째 주에 31 12 월 2012 - 그 날java - 주어진 월에 대한 각 주 시작 날짜와 종료 날짜를 얻으려면

년 1 월 2013 첫 주를 무시 - 14 1 월 2013 20 1 월 2,013 넷째 주 - 21 얀 2013 27 1 월 2013 다섯째 주 - 28 1 월 2013 년 2 월 03 2013

public static void main(String[] args) { 
    List<List<String>> weekdates = getNumberOfWeeks(2013, Calendar.JULY); 
    for(List<String> weekDatesLoop:weekdates){ 
     System.out.println("Start day: "+weekDatesLoop.get(0).toString()); 
     System.out.println("End day: "+weekDatesLoop.get(1).toString()); 
    } 
    } 
public static List<List<String>> getNumberOfWeeks(int year, int month) { 
     System.out.println("Month Id: "+month); 
     month = month-1; 
     System.out.println("Month Id: " + month); 
     SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); 
     List<List<String>> weekdates = new ArrayList<List<String>>(); 

     List<String> dates = new ArrayList<String>(); 
     Calendar c = Calendar.getInstance(); 
     c.set(Calendar.YEAR, year); 
     c.set(Calendar.MONTH, month); 
     c.set(Calendar.DAY_OF_MONTH, 1); 
     dates.add(format.format(c.getTime())); 
     //int numOfWeeksInMonth = 1; 
     while (c.get(Calendar.MONTH) == month) { 
      //System.out.println(c.get(Calendar.DAY_OF_WEEK)); 

      if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { 
      dates.add(format.format(c.getTime())); 
      weekdates.add(dates); 
      } 
      else if (c.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY) { 
      dates = new ArrayList<String>(); 
      dates.add(format.format(c.getTime())); 
      //numOfWeeksInMonth++; 
      } 
      c.add(Calendar.DAY_OF_MONTH, 1); 
     } 
     if(dates.size() < 2){ 
      c.add(Calendar.DAY_OF_MONTH, -1); 
      dates.add(format.format(c.getTime())); 
      weekdates.add(dates); 
     } 
     System.out.println(weekdates); 
     return weekdates; 
     } 

I 아직도이 일을하고 있습니다. 누구든지이 문제를 해결하는 데 도움을 줄 수 있습니까?

+2

더 나은 알고리즘을 답을 얻을 다음을 도달 할 때까지 반복 한 일을 추가, 쓰기, 달의 1 일부터 시작 다시 U까지가는 월요일을 찾아 6 일 추가 일요일 월말 이후; 및 포인터 : 메서드를 작은 메서드로 분할하면 코드가 훨씬 간단 해지고 더 읽기 쉽습니다. – Dariusz

+0

@DariuszWawer 감사합니다. 나는 당신의 알고리즘을 따랐고 효과가있었습니다. – user1514499

답변

1

나는 다음과 같은 코드로

List<List<String>> getNumberOfWeeks(int year, int month) { 
     SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy"); 
     List<List<String>> weekdates = new ArrayList<List<String>>(); 
     List<String> dates; 
     Calendar c = Calendar.getInstance(); 
     c.set(Calendar.YEAR, year); 
     c.set(Calendar.MONTH, month); 
     c.set(Calendar.DAY_OF_MONTH, 1); 
     while (c.get(Calendar.MONTH) == month) { 
       dates = new ArrayList<String>(); 
       while (c.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) { 
       c.add(Calendar.DAY_OF_MONTH, -1); 
       } 
       dates.add(format.format(c.getTime())); 
       c.add(Calendar.DAY_OF_MONTH, 6); 
       dates.add(format.format(c.getTime())); 
       weekdates.add(dates); 
       c.add(Calendar.DAY_OF_MONTH, 1); 
     } 
     System.out.println(weekdates); 
     return weekdates; 
     } 
1

가능한 해결 방법은 휠을 다시 작성하지 않고 JodaTime 또는 이와 유사한 라이브러리를 사용하는 것입니다. 예를 들어 DateTime에있는 dayOfWeek() 함수를 사용하면 내가 원하는 정보를 얻을 수 있습니다.

관련 문제