Java 以 MM/dd/yyyy 格式获取下个月的 FirstDate 和 LastDate,即使输入不是该月的第一天

Java get FirstDate and LastDate of following month in MM/dd/yyyy format even if the input is not the first day of the month

我下面有一个函数,它有一个输入 Date,它将 return 第一个和最后一个 Date下个月 MM/dd/yyyy 格式。

String string = "01/01/2022";
DateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
Date dt = sdf .parse(string);
Calendar c = Calendar.getInstance();
c.setTime(dt);
c.add(Calendar.MONTH, 1);  
String firstDate = sdf.format(c.getTime());
System.out.println("FirstDate:" + firstDate);
c.add(Calendar.MONTH, 1);
c.add(Calendar.DAY_OF_MONTH, -1);
String lastDate = sdf.format(c.getTime());
System.out.println("LastDate:" + lastDate);

以上将给我如下输出

FirstDate:02/01/2022
LastDate:02/28/2022

如果输入是上个月的第一天,这很有效,我想要实现的是获得下一个 month 的 FirstDate 和 LastDate,即使输入的日期是不是月份的第一个日期,例如 01/31/2022 给我下面的输出

FirstDate:02/28/2022
LastDate:03/27/2022

但我还是希望它能给我第一个出

FirstDate:02/01/2022
LastDate:02/28/2022

你可以在 Java 中更轻松地做到这一点 8. 使用 java.time.YearMonth,用它的方法 now() 获取当前的,并导出第一个和最后一个 LocalDate它:

public static void main(String[] args) {
    // get the current month
    YearMonth currentMonth = YearMonth.now();
    // get the date with day of month = 1 using the current month
    LocalDate firstOfMonth = currentMonth.atDay(1);
    // then get its last date (no number required here)
    LocalDate lastOfMonth = currentMonth.atEndOfMonth();
    // prepare a formatter for your desired output (default: uuuu-MM-dd)
    DateTimeFormatter customDtf = DateTimeFormatter.ofPattern("MM/dd/uuuu");
    // print the month and year without a formatter (just for visualization)
    System.out.println("Month:     " + currentMonth);
    // then print both desired dates using the custom formatter
    System.out.println("FirstDate: " + firstOfMonth.format(customDtf));
    System.out.println("LastDate:  " + lastOfMonth.format(customDtf));
}

这会打印

Month:     2022-05
FirstDate: 05/01/2022
LastDate:  05/31/2022

您当然可以使用任何给定的月份,您可以使用 YearMonth.of(int year, int month) 来创建您的示例值:

YearMonth currentMonth = YearMonth.of(2022, 2);

不要使用日期,因为它已过时且存在错误。使用 LocalDate and other classes from the java.time 包。

  • 以下先使用现有日期,然后将 1 添加到月份。如果需要,这也会导致年份增加。
  • 然后 dayOfMonth 作为 1 或该月的最后一天。自动考虑闰年。
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM/dd/yyyy");
LocalDate date = LocalDate.parse("12/22/2020", dtf);
date = date.plusMonths(1);
LocalDate endDate = date.withDayOfMonth(date.lengthOfMonth());
LocalDate startDate = date.withDayOfMonth(1);
System.out.println("FirstDate: " +startDate.format(dtf));
System.out.println("LastDate:  " +endDate.format(dtf));

打印

FirstDate: 01/01/2021
LastDate:  01/31/2021