Java LocalDate格式为2000-1-2的错误

时间:2018-10-25 08:12:10

标签: java datetime-format localdate

今天,在新构建机器上的某些测试失败了,而在其他机器上的测试没问题。照看问题表明

@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"));
}

结果为“ j​​ava.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)

(操作系统Ubuntu 14.04)

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

2 个答案:

答案 0 :(得分:2)

您很可能不希望使用“ YYYY-MM-dd”格式,而是希望使用“ yyyy-MM-dd”格式。

“ Y”是基于周的年份,这取决于语言环境。在某些语言环境中,2000年1月2日可能属于以周为基础的1999年,在其他语言环境中,2000年1月2日可能属于以周为基础的2000年。

“ y”是年份,通常用作日历年。

答案 1 :(得分:1)

当我仅打印结果的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版本可能无法识别出差异,而较新的Java版本可以识别。有关解释,请查看@ThomasKläger的答案。