-3

我目前收到此错误,我真的不知道为什么

java.time.format.DateTimeParseException: Text '21:5:20' could not be parsed at index 3
        at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
        at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
        at java.time.LocalTime.parse(LocalTime.java:441)
...

这是我用来解析的方法。

public static ZonedDateTime parse(String fecha, String pattern) {
    DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_TIME;
    LocalTime date = LocalTime.parse(fecha, formatter);

    return ZonedDateTime.of(LocalDateTime.of(LocalDate.now(), date), ZoneId.systemDefault());
  }

我需要返回 a ZonedDateTime,因此我正在做我正在做的事情。该错误表明它似乎从文件中读取了正确的时间21:5:20,这看起来是有效的,但由于某种原因它无法解析它。

我真的不知道我做错了什么。与此类似的问题是指日期,而不是时间。

我知道这似乎是一个微不足道的问题,但我真诚地感谢 Java 专家的帮助。先感谢您。

4

2 回答 2

1

使用格式"H:m:s"

细节:

小时、分钟和秒在DateTimeFormatter.ISO_LOCAL_TIME格式中,HH:mm:ss而您的时间字符串没有两位数的分钟。该格式"H:m:s"适用于单位数和两位数的时间单位。

演示:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {

    public static void main(String[] args) {
        System.out.println(parse("21:5:20", "H:m:s"));
    }

    public static ZonedDateTime parse(String fecha, String pattern) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern, Locale.ENGLISH);
        LocalTime time = LocalTime.parse(fecha, formatter);

        return ZonedDateTime.of(LocalDateTime.of(LocalDate.now(), time), ZoneId.systemDefault());
    }

}

在我的时区输出:

2021-06-27T21:05:20+01:00[Europe/London]

ONLINE DEMO

从Trail: Date Time了解有关现代日期时间 API 的更多信息。

于 2021-06-27T20:02:14.163 回答
0

时间格式不正确ISO_LOCAL_TIME。小时、分钟和秒的固定宽度分别为 2 位数字。它们应该用零填充以确保两位数。可解析的时间是:21:05:20

如果您无法更改输入格式,您可以创建自己的 DateTimeFormatter:

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .appendValue(HOUR_OF_DAY, 2)
        .appendLiteral(':')
        .appendValue(MINUTE_OF_HOUR, 1, 2, SignStyle.NEVER)
        .optionalStart()
        .appendLiteral(':')
        .appendValue(SECOND_OF_MINUTE, 2)
        .toFormatter();

LocalTime date = LocalTime.parse("21:5:20", formatter);

System.out.println(date);

印刷:

21:05:20

于 2021-06-27T19:50:33.657 回答