【问题标题】:DateTimeFormatter adding a year to date after formatting [duplicate]DateTimeFormatter 在格式化后添加一年至今[重复]
【发布时间】:2019-12-15 12:07:43
【问题描述】:

我正在尝试将2019-12-30 格式的日期转换为30-12-2019 格式的日期,为此我想到了使用DateTimeFormatter,为此我有以下代码:

LocalDate date = LocalDate.parse("2019-12-30");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-YYYY");
System.out.println(formatter.format(date));

然而,令我惊讶的是,这会返回一个输出:

30-12-2020

而不是预期的30-12-2019。如果日期设置为2019-11-30,它会正确返回30-11-2019。我在做一些非常错误的事情,但我无法弄清楚到底是什么。有人可以帮忙吗?

【问题讨论】:

    标签: java datetime-format


    【解决方案1】:

    来自DateTimeFormatter documentation:,表示符号、含义及例子:

    Y 基于周的年份 1996 年; 96

    因此,您正在格式化基于周的年份,而不是常规年份。 2019 年 12 月 30 日属于 2020 年的第一周,因此是您的输出。

    使用yyyy(年份)或uuuu(年份)代替YYYY,您将得到2019。

    基本上,YYYY 通常应与w(基于周数的年份)和E(周数)一起使用。

    【讨论】:

      【解决方案2】:

      使用"dd-MM-yyyy" 而不是"dd-MM-YYYY" 尝试以下代码 sn-p 以获得预期的结果 -

      LocalDate date = LocalDate.parse("2019-12-30");
      DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
      System.out.println("date " + formatter.format(date)); // date 30-12-2019
      

      【讨论】:

      • 您之前已经解释了为什么我应该使用yyyy,这个答案要好得多。你能编辑并添加解释吗?
      【解决方案3】:

      您正在使用DateTimeFormatter.ofPattern("dd-MM-YYYY"); 并注意到Y 代表week-based-year,这可能是您不想要的。也许您希望您的模式为"dd-MM-uuuu"。有关模式的更多信息,请参阅 Oracle 官方文档:Patterns for Formatting and Parsing

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-06
        • 1970-01-01
        相关资源
        最近更新 更多