java - 获取给定月份每周的开始日期和结束日期

时间:2013-01-25 12:09:36

标签: java date calendar

以下是我用来计算给定月份的周开始日期和结束日期的代码。 假设周开始日是星期一,星期结束日是星期日。 例如,2013年1月将有5周。 如果月份从星期日开始 - 忽略那一天

2013年1月 第一周 - 2012年12月31日至2013年1月6日 第二周 - 2013年1月7日至2013年1月13日 第三周 - 2013年1月14日至2013年1月20日 第四周 - 2013年1月21日至2013年1月27日 第五周 - 2013年1月28日至2013年2月3日

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;
      }

我还在努力。 任何人都可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

一种可能的解决方案可能是不重新发明轮子并使用JodaTime或类似的库。例如,您可以使用DateTime上的dayOfWeek()功能获取您所获得的信息。

答案 1 :(得分: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;
      }

答案 2 :(得分:1)

您使用的是可怕的日期时间类,而这些类早已被JSR 310中定义的现代 java.time 类取代了。现在,这项工作要容易得多。

YearMonth

YearMonth类代表整个特定的月份。使用Month枚举指定月份。

YearMonth ym = YearMonth.of( 2013 , Month.JANUARY ) ;

LocalDate

获取本月的第一天。

LocalDate firstOfMonth = ym.atDay( 1 ) ;

TemporalAdjuster

获取上一个星期一,如果是星期一,则保留该日期。

TemporalAdjuster ta = TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY ) ;
LocalDate previousOrSameMonday = firstOfMonth.with( ta ) ;

然后一次循环一周。

LocalDate endOfMonth = ym.atEndOfMonth() ;
LocalDate weekStart = previousOrSameMonday ; 
do {
    LocalDate weekStop = weekStart.plusDays( 6 ) ;
    System.out.println( "Week: " + weekStart + " to " + weekStop ) ;
    // Set up the next loop.
    weekStart = weekStart.plusWeeks( 1 ) ;
} while ( ! weekStart.isAfter( endOfMonth ) ) ;

请参阅此code run live at IdeOne.com

  

周:2012年12月31日星期一至2013年1月6日星期日

     

周:2013年1月7日星期一至2013年1月13日星期日

     

周:2013年1月14日星期一至2013年1月20日星期日

     

周:2013年1月21日星期一至2013年1月27日星期日

     

周:2013年1月28日星期一至2013年2月3日星期日

顺便说一句,您可能想了解并考虑使用ISO 860 standard definition of a week。然后使用YearWeek库的ThreeTen-Extra类。