使用 java 8 解析 LocalDateTime 时出现问题

Problem with parse a LocalDateTime using java 8

我有这段代码,这是一个简单的字符串,我想将它解析为 LocalDateTime

    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    import java.time.format.DateTimeFormatterBuilder;

    public class DateClass {

        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {

            String dateRaw = "2019-05-03 7:05:03";        

            DateTimeFormatter dtf = new DateTimeFormatterBuilder().appendPattern("uuuu-mm-dd HH:mm:ss").toFormatter(); 

            LocalDateTime date= LocalDateTime.parse(dateRaw, dtf);
            System.out.println(date.toString());
        }

    }

当你运行时,我遇到了下一个错误:

Exception in thread "main" java.time.format.DateTimeParseException: Text '2019-05-03 7:05:03' could not be parsed at index 11
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    at java.time.LocalDateTime.parse(LocalDateTime.java:492)
    at lectordeachvio.DateClass.main(DateClass.java:18)

我做错了什么?为什么 de space 有问题????

您应该更改有关月份的模式,因为您使用的是分钟:

"uuuu-MM-dd HH:mm:ss"

请参阅docs。并按照提供的模式将示例日期小时部分从 7 更改为 07。

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd H:mm:ss");

通过此更改您的程序输出:

2019-05-03T07:05:03

  • 单一格式模式字母 H 将匹配 1 位或两位数的小时。也就是说,它将接受 70713 等。另一方面,两个 HH 需要两个数字,例如 0713,所以不能单独解析7。这就是您遇到异常的原因。
  • 字符串的索引 11 不在 space 所在的位置。这是 7 所在的位置。索引从 0 开始。
  • 正如其他人提到的,您还需要使用大写 MM 作为月份编号。小写 mm 表示小时。
  • 顺便说一句,对于这种情况,您不一定需要 DateTimeFormatterBuilderDateTimeFormatter.ofPattern 工作正常。

出于好奇,如果您的格式化程序仅用于解析,您可以省略所有重复的模式字母。这也有效:

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("u-M-d H:m:s");

不过通常我们不希望这样。我们更愿意验证 两位数字表示分钟和秒,通常也用于月份和日期。放两个模式字母就可以做到这一点。

格式模式中关于 mm 的部分相关问题:Convert LocalDate in DD/MM/YYYY LocalDate [duplicate].