【问题标题】:Problem with parse a LocalDateTime using java 8使用 java 8 解析 LocalDateTime 的问题
【发布时间】:2020-03-12 04:00:29
【问题描述】:

我有这段代码,它是一个简单的字符串,我想将其解析为 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有问题???

【问题讨论】:

  • HH 应该是 07,但你为什么要使用分钟两次?
  • 尝试使用“2019-05-03 07:05:03”作为您的日期模式
  • 大写 M 表示月份,y 表示年份
  • @Jens 严格来说y 不是一年。 u 是一个(签名的)年份。 y 代表时代。见uuuu versus yyyy in DateTimeFormatter formatting pattern codes in Java?
  • 这是个好问题。我认为预期的结果很明确,而且问题很少。格式良好的堆栈跟踪形式的可重现示例和特定问题。新的堆垛机做得很好。另外我认为这个问题可能对许多未来的读者有用(如果他们能找到它,我承认它可能很难搜索)。

标签: parsing java-8 java-time localdate datetime-parsing


【解决方案1】:
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd H:mm:ss");

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

2019-05-03T07:05:03

  • 单个格式模式字母H 将匹配1 位或2 位数字的小时。也就是说,它将接受70713 等。另一方面,两个HH 需要两个数字,例如0713,因此无法单独解析7。这就是您遇到异常的原因。
  • 字符串的索引 11 不在空格所在的位置。这是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]

【讨论】:

  • 非常感谢你们所有人,特别是你们 Ole.V.V.如您所说,它可以使用 String dateRaw = "2019-05-03 7:05:03"; DateTimeFormatter dtf = new DateTimeFormatterBuilder().appendPattern("uuuu-MM-dd H:mm:ss").toFormatter();使用这个: DateTimeFormatter dtf = DateTimeFormatter.ofPattern("u-M-d H:m:s");我有一个错误
  • 这里是正确的代码:public class DateClass { public static void main(String[] args) { String dateRaw = "2019-05-03 12:05:03"; DateTimeFormatter dtf = new DateTimeFormatterBuilder().appendPattern("uuuu-MM-dd H:mm:ss").toFormatter(); LocalDateTime date= LocalDateTime.parse(dateRaw, dtf); System.out.println("LocalDatetime ->"+date.toString()); try { Date date1 = new SimpleDateFormat("yyyy-MM-dd H:mm:ss").parse(dateRaw); System.out.println("Date ->"+ date1); }catch(Exception e){}}}
  • 感谢您发布代码。为了你好,请不要涉及SimpleDateFormat 类,它是一个臭名昭著的麻烦制造者。而 java,time 为您提供所需的所有功能以及更多功能。并且不要“吞下异常”:一个空的 catch 块是一个 nono,它会对你隐藏错误,所以就像蒙着眼睛编码一样。
【解决方案2】:

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

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

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

【讨论】:

  • 更改日期或模式?
  • 另外我认为SO上有重复,所以你应该链接zehn而不是写一个新的答案。
  • @Jens 你很容易就被骗了,所以如果你能找到原件?我还没有找到任何(还)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 2020-10-23
  • 2016-09-12
  • 2020-07-11
  • 2018-02-12
  • 2015-02-22
  • 1970-01-01
相关资源
最近更新 更多