【问题标题】:Java LocalDate Formatting of 2000-1-2 error [duplicate]Java LocalDate Formatting of 2000-1-2 错误 [重复]
【发布时间】:2019-03-29 18:41:59
【问题描述】:

今天在新构建机器上的一些测试失败了,在其他机器上还可以。处理问题表明

@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)

(操作系统 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)

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

【问题讨论】:

  • 您最好Assert.assertEquals("2000-01-02",result); 以获得更多的故障信息。
  • 你试过"yyyy-MM-dd"的格式吗?也许大写 "Y" 是问题...我尝试打印它并且没有大写 "Y" 它可以工作。
  • yyyy 工作正常,但问题是为什么 'YYYY' 在旧版本中工作?
  • 对于您想要的结果,您不需要格式化程序。只需使用LocalDate.of(2000,1,2).toString()
  • 除了错误的大小写(Y 而不是y)之外,还有一个地区差异会在你身上耍花招。出现错误的 JVM 具有使用 ISO 8601 周的默认语言环境。在 ISO 8601 中,2000 年 1 月 1 日星期日属于 1999 年的最后一周,因此您得到 1999 年。它似乎工作的 JVM 使用美国(或类似)区域设置和星期方案。在美国,那一天属于新的一周年(我什至相信它属于 2000 年的第 2 周)。对于其他日期,只要您使用YYYY,您也会在这台计算机上得到不正确的结果。

标签: java datetime-format localdate


【解决方案1】:

您很可能不想要“YYYY-MM-dd”格式,而是“yyyy-MM-dd”。

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

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

【讨论】:

    【解决方案2】:

    当我只打印结果的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 的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-01
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多