如何遍历当前年份的每个月并获取每个月的第一个和最后一个日期

Ash*_*ava -3 java calendar

我想遍历给定年份或当年的所有月份,并获得每个月的第一个和最后一个日期。例如。当前年份是 2017 年和 10 月。所以我想从 2017 年 10 月到 2017 年 12 月循环并获取每个月的第一个和最后一个日期,比如 10 月的第一个日期是 2017-10-01,最后一个日期是 2017-10-31。

小智 9

通过使用日历(适用于所有 Java 版本):

        Calendar cal = Calendar.getInstance();
        int month = cal.get(Calendar.MONTH);
        int year = cal.get(Calendar.YEAR);
        cal.clear();
        cal.set(Calendar.YEAR, year);

        for (int currentMonth = month; currentMonth < 12; currentMonth++) {

            cal.set(Calendar.MONTH, currentMonth);

            //first day :
            cal.set(Calendar.DAY_OF_MONTH, 1);
            Date firstDay = cal.getTime();
            System.out.println("firstDay=" + firstDay);

            //last day
            cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
            Date lastDay = cal.getTime();
            System.out.println("lastDay=" + lastDay);
        }
Run Code Online (Sandbox Code Playgroud)

通过使用新的 Java 8 日期/时间 API:

LocalDate date = LocalDate.now();
        int month = date.getMonthValue();

        for (int currentMonth = month; currentMonth <= 12; currentMonth++) {
            date = date.withMonth(currentMonth);

            //start of month :
            LocalDate firstDay = date.withDayOfMonth(1);
            System.out.println("firstDay=" + firstDay);

            //end of month
            LocalDate lastDay = date.with(TemporalAdjusters.lastDayOfMonth());
            System.out.println("lastDay=" + lastDay);
        }
Run Code Online (Sandbox Code Playgroud)

编辑JAVA8+

另一种方法可能是:文档

import static java.time.temporal.TemporalAdjusters.*;//to get functions firstDayOfMonth() and lastDayOfMonth()
...
LocalDate initialdate= ...
LocalDate localDateNow = ...
DateTimeFormatter format1 = ...

for(LocalDate date = initialdate; date.isBefore(localDateNow); date = date.plusMonths(1)) { //Could be plusdays if you want to interate day by day

    LocalDate dtini = date.with(firstDayOfMonth());
    LocalDate dtend = dtini.with(lastDayOfMonth());
    //LocalDate dtend = dtini.plusDays(14); //If you want from day 1 do 15

    //TODO: Use dtini and dtend to your like
    System.out.println("dtini =" + format1.format(dtini));
    System.out.println("dtend =" + format1.format(dtend));

}
Run Code Online (Sandbox Code Playgroud)

  • 好答案。您可以通过将 `for` 循环替换为使用 `EnumSet` 和 `YearMonth` 而不是 `TemporalAdjuster` 来使用 `Month` 枚举来获得更漂亮的效果:`for ( Month month : EnumSet.range( today.getMonth( today.getMonth() ) , Month.DECEMBER ) )` 参见示例 [代码在 IdeOne.com 上实时运行](https://www.ideone.com/G4BwY6) (2认同)