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]
链接
文档链接:
尝试转换字符串时得到 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]
链接
文档链接: