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

mum43rcc  于 2021-07-11  发布在  Java
关注(0)|答案(3)|浏览(204)

得到一个 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);

piah890a

piah890a1#

你的图案和你的线不一样。检查最后一部分在哪里 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");

它会起作用,因为你的约会就像你的模式。请注意,日期中的每个数字也都是按模式排列的。
但是对于你的约会对象来说,有一个没有意义的空白,所以删除它,代码就完美地工作了。

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 .

woobm2wo

woobm2wo2#

这个 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 以保留分区偏移信息。

ca1c2owp

ca1c2owp3#

使用内置格式化程序

内置的 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 是要解析到的正确类。如果我们用 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]

链接

文档链接: DateTimeFormatter.ISO_OFFSET_DATE_TIME .
两个arg DateTimeFormatter.parse​(CharSequence, ParsePosition) 我用过的。

相关问题