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

Emm*_*ngo 0 java datetime calendar 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);
Run Code Online (Sandbox Code Playgroud)

上面的内容会给我如下的输出

FirstDate:02/01/2022
LastDate:02/28/2022
Run Code Online (Sandbox Code Playgroud)

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

FirstDate:02/28/2022
LastDate:03/27/2022
Run Code Online (Sandbox Code Playgroud)

但我仍然希望它能给我第一个

FirstDate:02/01/2022
LastDate:02/28/2022
Run Code Online (Sandbox Code Playgroud)

WJS*_*WJS 5

不要使用 Date,因为它已经过时且有问题。使用java.time包中的LocalDate和其他类。

  • 以下内容首先采用现有日期,然后添加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));
Run Code Online (Sandbox Code Playgroud)

印刷

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


Run Code Online (Sandbox Code Playgroud)