从日期范围内查找整月 java

Raj*_*ria -1 java date

我有两个日期:

Start Date: 2017-01-15
End Date: 2017-05-27
Run Code Online (Sandbox Code Playgroud)

现在我想找到这两个日期之间的整月。所以结果应该是:

Feb-2017
Mar-2017
Apr-2017
Run Code Online (Sandbox Code Playgroud)

一月不包括在结果中,因为开始日期从月中开始,五月不包括在结果中,因为结束日期不包括整个五月。

我怎样才能用 Java 实现这一点?

我试过做这样的事情:

String date1 = "2015-01-15";
String date2 = "2015-05-27";

DateFormat formater1 = new SimpleDateFormat("MMM-yyyy");
DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");

Calendar startCalendar = Calendar.getInstance();
Calendar endCalendar = Calendar.getInstance();

try {
    startCalendar.setTime(formater.parse(date1));
    endCalendar.setTime(formater.parse(date2));
} catch (ParseException e) {
    e.printStackTrace();
}

System.out.println("startDate:" + startCalendar.getTime());
System.out.println("endCalendar:" + endCalendar.getTime());

while (startCalendar.before(endCalendar)) {
    // add one month to date per loop
    String date = formater1.format(startCalendar.getTime()).toUpperCase();
    System.out.println(date);
    startCalendar.add(Calendar.MONTH, 1);
}
Run Code Online (Sandbox Code Playgroud)

但我不知道如何从结果中排除 Jan 和 May。目前,我得到了这个结果:

JAN-2015
FEB-2015
MAR-2015
APR-2015
MAY-2015
Run Code Online (Sandbox Code Playgroud)

nbr*_*oks 5

随着 Java 8 的发布,Oracle 大幅改进了他们的日期时间库,使日历逻辑的实现变得更加简单。查看java.time文档以获取更多详细信息。受支持的函数包括withDayOfMonthlastDayOfMonth,它们允许您查找给定月份内的特定日期。

看看这个实现,使用 java.time API 进行格式化和日期操作:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

import static java.time.temporal.TemporalAdjusters.lastDayOfMonth;

public class Main {

    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM-yyyy");

        LocalDate start = LocalDate.of(2017, 1, 15);
        LocalDate end = LocalDate.of(2017, 5, 27);
        List<String> months = new ArrayList<>();

        LocalDate date = start;
        if (date.getDayOfMonth() == 1) {
            date = date.minusDays(1);
        }

        while (date.isBefore(end)) {
            if (date.plusMonths(1).with(lastDayOfMonth()).isAfter(end)) {
                break;
            }

            date = date.plusMonths(1).withDayOfMonth(1);
            months.add(date.format(formatter).toUpperCase());
        }

        System.out.println(months);
    }

}
Run Code Online (Sandbox Code Playgroud)

输出:

> [FEB-2017, MAR-2017, APR-2017]
Run Code Online (Sandbox Code Playgroud)

  • 好答案。根据上下文,一个吸引人的变体会将“YearMonth”对象存储在列表中,并仅在输出中对其进行格式化。 (2认同)