DateTimeParseException:无法解析文本“2020-04-01T08:53:47.000+02:00 00:00”,在索引 29 处找到未解析的文本

DateTimeParseException: Text '2020-04-01T08:53:47.000+02:00 00:00' could not be parsed, unparsed text found at index 29

尝试转换字符串时得到 DateTimeParseExcpetion 2020-04-01T08:53:47.000+02:00 00:00

String date = "2020-04-01T08:53:47.000+02:00 00:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSz");
parsedDate = LocalDateTime.parse(date,formatter).toString();
System.out.println(parsedDate);

日期时间字符串末尾的 00:00 对我来说没有意义。剥离后解析日期时间字符串。

import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String strDate = "2020-04-01T08:53:47.000+02:00 00:00";
        strDate = strDate.substring(0, strDate.lastIndexOf(' '));
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSz", Locale.ENGLISH);
        LocalDateTime parsedDate = LocalDateTime.parse(strDate, formatter);
        System.out.println(parsedDate);

        OffsetDateTime odt = OffsetDateTime.parse(strDate);
        System.out.println(odt);
        System.out.println(odt.getOffset());
    }
}

输出:

2020-04-01T08:53:47
2020-04-01T08:53:47+02:00
+02:00

注意: 您可以将日期时间字符串(从末尾剥离 00:00 后)解析为 OffsetDateTime 以保留区域偏移信息。

您的模式与您的字符串不同。检查最后一部分 000+02:00 00:00.

您的模式是:SSSz

如果你试试这个:

String date = "2020-04-01T08:53:47.000";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");

它会起作用,因为你的约会就像你的模式。请注意,日期中的每个数字也符合模式。

但是对于你的约会有一个空的 space 没有任何意义,所以删除它,代码工作完美。

String date = "2020-04-01T08:53:47.000+02:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSz");

输出:

2020-04-01T08:53:47

请注意,z 是当地时间,意思是“零时差”或“祖鲁时间”(UTC),您可以使用 Locale

使用内置格式化程序

内置的 DateTimeFormatter.ISO_OFFSET_DATE_TIME 匹配您的字符串中我们可以理解的部分。它可以只解析那部分而忽略其余部分。

    String date = "2020-04-01T08:53:47.000+02:00 00:00";
    ParsePosition pp = new ParsePosition(0);
    OffsetDateTime odt = OffsetDateTime.from(
            DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(date, pp));
    
    System.out.println("Date and time: " + odt);
    System.out.println("Unparsed text: " + date.substring(pp.getIndex()));

输出:

Date and time: 2020-04-01T08:53:47+02:00
Unparsed text:  00:00

由于您的字符串包含与 UTC 的偏移量,因此 OffsetDateTime 是要解析的正确 class。如果我们使用LocalDateTIme,偏移量将被忽略,我们最终将不知道在哪个偏移量处解释时间,也就是说,我们无法知道它是哪个时间点。使用 OffsetDateTime 时点是明确的。如果你想转换成你所在时区的时间,转换成ZonedDateTime(仍然不是LocalDateTime)。

    ZonedDateTime timeInMyTimeZone = odt.atZoneSameInstant(ZoneId.systemDefault());
    System.out.println("Date and time: " + timeInMyTimeZone);

示例输出:

Date and time: 2020-04-01T11:53:47+05:00[Asia/Aqtobe]

链接

文档链接: