3

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

2013 年 1 月 第一周 - 2012 年 12 月 31 日至 2013 年 1 月 6 日 第二周 - 2013 年 1 月 7 日至 2013 年 1 月 13 日 第三周 - 2013 年 1 月 14 日至 2013 年 1 月 20 日 第四周 - 1 月 21 日-2013 年至 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;
      }

我仍在努力。谁能帮我解决这个问题?

4

3 回答 3

2

您正在使用糟糕的日期时间类,这些类在几年前被 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 ) ) ;

请参阅在 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 标准定义的一周。然后使用ThreeTen-Extra库的YearWeek类。

于 2019-08-06T21:27:44.967 回答
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;
      }
于 2013-01-28T06:33:43.217 回答
1

一个可能的解决方案可能是不重新发明轮子并使用JodaTime或类似的库。例如,您可以使用 a 上的dayOfWeek()函数DateTime来获取您想要的信息。

于 2013-01-25T12:18:40.980 回答