2013-01-25 241 views
2

以下是我用來計算給定月份的周開始日期和結束日期的代碼。 假設周開始日是星期一,星期結束日是星期日。例如,2013年1月將有5周。 如果一個月週日開始 - 那一天java - 獲取給定月份每週的開始日期和結束日期

2013年1月 第一個星期忽略 - 31日 - 12月2012年06 - 2013 第二週 - 07 - 2013年13月 - 2013 第三週 - 1月14日 - 2013年20月 - 2013 第四周 - 1月21日 - 2013年1月27日 - 2013 第五週 - 1月28日 - 2013年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; 
     } 

我我仍在爲此工作。 任何人都可以請幫我解決這個問題嗎?

+2

更好的算法:從本月的第1天開始回去,直到ü找到一個週一,加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()函數來獲取您之後的信息。

相關問題