Java LocalDate 无效的日期格式

Java LocalDate invalid date formatting

我有一个脚本可以获取当前日期的上个月(每月第一个日期执行的脚本)脚本return除了一月

我尝试用这些脚本重现案例

import java.time.*;

class Main {
  public static void main(String[] args) {
    LocalDate today = LocalDate.of(2022, 1, 1); 
    LocalDate prevMonth = today.minusDays(1); 
    
    System.out.println("Date object " + prevMonth);
    System.out.println("Date formatted " + prevMonth.format(DateTimeFormatter.ofPattern("YYYY-MM-dd")));
  }
}

输出:

Date object 2021-12-31
Date formatted 2022-12-31

result

环境

openjdk 11.0.11 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.18.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.18.04, mixed mode, sharing)

bug 是从哪里来的,或者你有更好的主意?

PS:我更喜欢 LocalDate 而不是日历

大写 'D' 是年中的第几天,而不是月中的第几天。
https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

您可能正在寻找 'd' - 月中的某天。 DateTimeFormatter.ofPattern("YYYY-MM-dd")

你真的需要仔细阅读文档。

不要使用Y

Y 表示 'weekyear'。你真的,真的,真的不想要这个。它会在 1 月 1 日 左右 的某个地方变成 2022,但不会在 1 月 1 日(好吧,大约 7 年左右,它设法完美排列)。 X 年的某些天的年份为 (X+1),Z 年的某些天的年份为 (Z-1):毕竟,一周从星期一开始,所以'weekyear' 除星期一外无法更改。 1月1号出来?不总是星期一。

你想要uy 总是很棒,但是 y 在 0 年之前的几年里做了一些愚蠢的事情。除此之外,uy 是相同的。换句话说,u 更好,这是你应该使用的。

你也不想要D.

D 表示一年中的某一天。你想要一个月中的哪一天。那就是符号 d(小写)。

尝试"uuuu-MM-dd"