Я работаю над REST API, который поддерживает Date как параметр запроса.Так как это параметр запроса, это будет строка.Теперь Дата может быть отправлена в следующих форматах в QueryParams:
yyyy-mm-dd[(T| )HH:MM:SS[.fff]][(+|-)NNNN]
Это означает, что следующие действительные даты:
2017-05-05 00:00:00.000+0000
2017-05-05 00:00:00.000
2017-05-05T00:00:00
2017-05-05+0000
2017-05-05
Теперь, чтобы проанализировать все эти разные даты и времени, яиспользуя Java8 datetime
API.Код приведен ниже:
DateTimeFormatter formatter = new DateTimeFormatterBuilder().parseCaseInsensitive()
.append(DateTimeFormatter.ofPattern("yyyy-MM-dd[[ ][['T'][ ]HH:mm:ss[.SSS]][Z]"))
.toFormatter();
LocalDateTime localDateTime = null;
LocalDate localDate = null;
ZoneId zoneId = ZoneId.of(ZoneOffset.UTC.getId());
Date date = null;
try {
localDateTime = LocalDateTime.parse(datetime, formatter);
date = Date.from(localDateTime.atZone(zoneId).toInstant());
} catch (Exception exception) {
System.out.println("Inside Excpetion");
localDate = LocalDate.parse(datetime, formatter);
date = Date.from(localDate.atStartOfDay(zoneId).toInstant());
}
Как видно из кода, который я использую DateTimeFormatter
и добавляющего шаблон.Теперь я сначала пытаюсь разобрать дату как LocalDateTime
в try-block
, и если она выдает исключение для случаев, таких как 2017-05-05
, так как время не прошло, я использую LocalDate
в catch block
.
Приведенный выше подход дает мне решение, которое я ищу, но мои вопросы таковы: является ли это стандартным способом работы с датой, отправленной в виде строки, и соответствует ли мой подход этим стандартам?
Кроме того, если это возможно, каким-то другим способом я могу проанализировать различные виды дат (показанные как действительные даты выше), за исключением некоторых других простых решений, таких как использование списка Array и размещение всех возможных форматов, а затем использованиецикл for пытается разобрать дату?