首页 > 解决方案 > 是否可以将 Java 中的日期范围拆分为数周?

问题描述

我的问题如下:我有一个日期范围(在 java 中),由两个Calendar对象指定,一个用于开始,一个用于结束。现在我想得到一个在这个范围内的所有周的列表。一周应由两个Calendar对象指定,一个用于开始,一个用于结束。同样重要的是,整个日期范围的开始和结束可能在两个不同的月份甚至两个不同的年份。

标签: javadatejava-8calendardate-range

解决方案


这是您的问题的实现,它使用新的 Time Api,阅读有关 LocalDate、LocalDateTime、Period 等的信息。

        LocalDate startDate = LocalDate.of(2019, 12, 12).with(DayOfWeek.MONDAY);
        LocalDate endDate = LocalDate.of(2020, 12, 12);

        //number of weeks
        long weekNumber = ChronoUnit.WEEKS.between(startDate, endDate);

        Map<LocalDate, LocalDate> weeks = new LinkedHashMap<>();
        for (int i = 0; i < weekNumber; i++) {
            LocalDate endOfWeek = startDate.plusDays(6);
            weeks.put(startDate, endOfWeek);
            startDate = endOfWeek.plusDays(1);
        }
        for (LocalDate week : weeks.keySet()) {
            LocalDate endOfWeek = weeks.get(week);
            System.out.println("Start of week: " + week + "[" + week.getDayOfWeek() + "]" +
                    " End of week: " + endOfWeek + "[" + endOfWeek.getDayOfWeek() + "]");
        }

它打印:

Start of week: 2020-12-07[MONDAY] End of week: 2020-12-13[SUNDAY]
Start of week: 2020-12-14[MONDAY] End of week: 2020-12-20[SUNDAY]
Start of week: 2020-12-21[MONDAY] End of week: 2020-12-27[SUNDAY]
Start of week: 2020-12-28[MONDAY] End of week: 2021-01-03[SUNDAY]
Start of week: 2021-01-04[MONDAY] End of week: 2021-01-10[SUNDAY]

ETC...

编辑:

使用 DateTimeFormatter 会更短,并且日期名称将以您的语言显示:

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd[EEEE]");
for (LocalDate startOfWeek : weeks.keySet()) {
    LocalDate endOfWeek = weeks.get(startOfWeek);
    System.out.println("Start of week: " + dateTimeFormatter.format(startOfWeek) +
                    " End of week: " + dateTimeFormatter.format(endOfWeek));
    }

推荐阅读