TL; DR
LocalDate parsedDate = OffsetDateTime
.parse("20050912190509.0Z", DateTimeFormatter.ofPattern("uuuuMMddHHmmss.SX"))
.toLocalDate();
Это дает LocalDate
из 2005-09-12
.
java.time
Я помогаю современным ответом. Ответ Suhas Phartale правильный и был хорошим ответом, когда он был написан 7 лет назад. Теперь общеизвестно хлопотный класс SimpleDateFormat
давно устарел, и у нас намного лучше в java.time
, современном Java-API даты и времени. Я настоятельно рекомендую вам использовать это вместо старых классов даты и времени.
Подробнее
Судя по вашему коду, вы переформатируете строку из AD перед ее анализом. В этом нет необходимости, строка из AD может быть проанализирована напрямую. Мы могли бы проанализировать его непосредственно в LocalDate
, но я рекомендую разобрать его в OffsetDateTime
, чтобы получить время и смещение от строки; как вы можете видеть, это может быть непосредственно преобразовано в LocalDate
впоследствии. LocalDate
- это дата без времени суток, поэтому она лучше соответствует вашим требованиям, чем старый класс Date
.
Строка в UTC (обозначается Z
в конце). Выше приведена дата из строки, то есть дата в формате UTC. Если вместо этого вы хотели указать дату, которая была в вашем местном часовом поясе, когда это было 12 сентября, 19:05 по UTC:
LocalDate parsedDate = OffsetDateTime.parse(givenString, adDateTimeFormatter)
.atZoneSameInstant(ZoneId.of("America/Coral_Harbour"))
.toLocalDate();
Я предположил, что мы объявили форматер статическим полем:
private static final DateTimeFormatter adDateTimeFormatter
= DateTimeFormatter.ofPattern("uuuuMMddHHmmss.SX");
В этом случае результат тот же, для других часовых поясов он не будет. Пожалуйста, замените свой часовой пояс на America / Coral_Harbour. Чтобы использовать настройку часового пояса JVM, укажите ZoneId.systemDefault()
. Однако помните, что этот параметр может быть изменен другими частями вашей программы или другими программами, работающими в той же JVM, так что это хрупко.
И пункт из ответа Suhas Phartale действителен и в java.time
: строки шаблона формата чувствительны к регистру, и мне нужно было использовать строчные буквы dd
для дня месяца.
Учебник
Подробнее о java.time
в руководстве по Oracle и / или поиске других ресурсов в сети.