Java LocalDate格式2000-1-2错误

Java LocalDate Formatting of 2000-1-2 error

今天在一台新机器上的一些测试失败了,而在其他机器上却没问题。查看问题后显示

@Test
public void testDateTimeFormater()
{
    String result = LocalDate.of(2000,1,2)
            .format(DateTimeFormatter.ofPattern("YYYY-MM-dd"));
    Assert.assertTrue(result,result.equals("2000-01-02"));
}

结果 'java.lang.AssertionError: 1999-01-02'

无法运行的 jave 版本是

root@build02:~# java -version 
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

(OS Debian 9, Ubuntu 18.04)

在开发机器上,工作 java 版本是

java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

(OS Ubuntu 14.04)

有什么问题吗?有什么我可以检查的吗?

您很可能不想要 "YYYY-MM-dd" 格式,而是 "yyyy-MM-dd".

"Y" 是基于周的年份,它取决于语言环境。 2000 年 1 月 2 日在某些区域可能属于基于周的 1999 年,而在某些其他区域可能属于基于周的 2000 年。

"y" 是纪年,也就是通常用作日历年的年份。

当我只打印结果的 toString() 方法时,很明显传递给 DateTimeFormatter 的格式是问题所在:

public static void main(String[] args) {
    String result = LocalDate.of(2000,1,2)
            .format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
    System.out.println(result.toString());

    String wrongResult = LocalDate.of(2000,1,2)
            .format(DateTimeFormatter.ofPattern("YYYY-MM-dd"));
    System.out.println(wrongResult.toString());
}

这会打印

2000-01-02
1999-01-02

所以也许较旧的 Java 版本无法识别差异,但较新的版本可以。有关解释,请查看@ThomasKläger 的回答。