Этот вопрос похож на Как анализировать ZonedDateTime с зоной по умолчанию?, но дополнительное условие.
У меня есть строковый параметр, представляющий дату в формате Великобритании: «3/6/09». Он не содержит времени, только дату. Но может содержать его и даже часовой пояс. И я хочу разобрать его на ZonedDateTime
.
public static ZonedDateTime parse(String value) {
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(SHORT).withLocale(Locale.UK).withZone(ZoneId.systemDefault());
TemporalAccessor temporalAccessor = formatter.parseBest(value, ZonedDateTime::from, LocalDateTime::from, LocalDate::from);
if (temporalAccessor instanceof ZonedDateTime) {
return ((ZonedDateTime) temporalAccessor);
}
if (temporalAccessor instanceof LocalDateTime) {
return ((LocalDateTime) temporalAccessor).atZone(ZoneId.systemDefault());
}
return ((LocalDate) temporalAccessor).atStartOfDay(ZoneId.systemDefault());
}
Но это терпит неудачу с исключением:
java.time.format.DateTimeParseException: Text '3/6/2009' could not be parsed at index 6
Это баг у меня или нет?
DateTimeFormatter.ofLocalizedDateTime(...)
, поэтому в вашем вводе должен присутствовать как минимум час или любой компонент времени. Еще одно наблюдение: со старым pre8-кодомDate d = DateFormat.getDateInstance(DateFormat.SHORT, Locale.UK).parse(input);
все нормально, аDateTimeFormatter.ofLocalizedDate(...)
не работает! Возможно, Oracle изменила формат SHORT для библиотеки Threeten. Вероятно, вам следует предпочесть явный шаблон, а затем повторить попытку. Кстати, такой код с instanceof-выражениями мне порядком резал глаза (извините). - person Meno Hochschild   schedule 15.12.2014DateTimeFormatterBuilder.parseDefaulting()
и/или необязательными разделами, чтобы дополнить необязательные части вашего ввода, хотя в прошлом у меня не было только положительного опыта с этим. - person Meno Hochschild   schedule 15.12.2014