DateTimeParseException: текст '2020-04-01T08:53:47.000+02:00 00:00' не может быть проанализирован, неанализируемый текст найден в индексе 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);
3 ответа
Ваш шаблон не совпадает с вашим String. Проверьте последнюю часть, где находится
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
.
В
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
для сохранения информации о смещении зоны.
Используйте встроенный форматтер
Встроенный
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
. - Два аргумента
DateTimeFormatter.parse(CharSequence, ParsePosition)
что я использовал.