Почему эта строка даты не проходит проверку?
У меня есть файл JSON со значением 2020-03-07T04:11:20.000 для поля с заданным шаблономyyyy-MM-dd'T'HH:mm:ss.SSS. Я попытался добавить Z в конце, но проверка все равно не проходит. Есть идеи, почему?
Я попытался выполнитьOffsetDateTime.parse(mytext, DateTimeFormatter.ofPattern(mypattern)), и он выбросил исключение DateTimeParseException с невозможностью получить OffsetDateTime от TemporalAccessor
2 ответа
Поскольку ни шаблон, ни вход не имеют смещения часового пояса, вы не можете проанализировать его напрямую, чтобы OffsetDateTime
. Что вы можете сделать, так это проанализировать дату какLocalDateTime
и добавьте смещение к результату.
Например, используя ZoneOffset.UTC:
LocalDateTime ldt = LocalDateTime.parse(mytext, DateTimeFormatter.ofPattern(mypattern));
OffsetDateTime odt = ldt.atOffset(ZoneOffset.UTC)
Во-первых, вы используете неправильный класс, OffsetDateTime
для вашего случая. Поскольку вы упомянулиtimezone="UTC"
, вы должны использовать ZonedDateTime
. Обратите внимание, что после использования следующей аннотации созданная дата и время будет иметь вид2020-03-07T04:11:20.000 UTC
.
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS z", timezone="UTC")
который вы можете разобрать в ZonedDateTime
используя узор, yyyy-MM-dd'T'HH:mm:ss.SSS z
.
Демо:
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
String myPattern = "yyyy-MM-dd'T'HH:mm:ss.SSS z";
String myText = "2020-03-07T04:11:20.000 UTC";
System.out.println(ZonedDateTime.parse(myText, DateTimeFormatter.ofPattern(myPattern)));
}
}
Выход:
2020-03-07T04:11:20Z[UTC]
Если вы хотите сохранить формат даты и времени как 2020-03-07T04:11:20.000
тогда вы должны удалить timezone="UTC"
из аннотации и проанализируйте полученную строку даты и времени в LocalDateTime
вместо того ZonedDateTime
. Излишне говорить, что узор должен бытьyyyy-MM-dd'T'HH:mm:ss.SSS
в таком случае.