Вот современный ответ. SimpleDateFormat
был правильным ответом в 2011 году, когда был задан вопрос, но это уже не так. Старые классы оказались проблематичными, поэтому в конце 2014 года их замены появились в начале 2014 года.
Я был немного озадачен парой деталей в ваших форматах.
yyyy-mm-ddTHH:mm+0:0000
выглядит немного как дата-время смещения ISO 8601, но тогда +0:0000
должно быть смещением от UTC. Я предполагаю, что он мог быть задуман как смещение в формате h:mmss
, но это нестандартно и ничего такого, чего я не видел в других местах.
- Вы, кажется, спрашиваете am / pm в нижнем регистре. Это тоже нестандартно и не встроено в стандартные классы.
Я предлагаю:
DateTimeFormatter sourceFormat
= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm'+0:0000'");
DateTimeFormatter targetFormat
= DateTimeFormatter.ofPattern("MM-dd-uuuu hh:mm a", Locale.ENGLISH);
String sourceTime = "2017-07-05T20:31+0:0000";
String convertedTime = LocalDateTime.parse(sourceTime, sourceFormat)
.format(targetFormat)
.toLowerCase(Locale.ENGLISH);
System.out.println(convertedTime);
Это печатает
07-05-2017 08:31 pm
Я считаю, что безопаснее всего просто вводить буквально +0:0000
на входе, не пытаясь его интерпретировать. Для получения pm
в нижнем регистре я преобразовал всю строку в нижний регистр после форматирования. В этом ответе есть другая хитрость .
Попытка быть более гибкой с часами, минутами и секундами в смещении и иметь смысл их может быть:
sourceTime = sourceTime.replaceFirst("(\\d:\\d{2})(\\d{2})$", "0$1:$2");
String convertedTime = OffsetDateTime.parse(sourceTime)
.format(targetFormat)
.toLowerCase(Locale.ENGLISH);
replaceFirst
преобразует 0:0000
в 00:00:00
, что при предшествующем +
или -
соответствует смещению ISO 8601. Это будет работать и с другими смещениями (если час - одна цифра; вы можете попробовать поочередно одну и две цифры). В конкретном коде мы все еще игнорируем смещение при форматировании, но при желании его можно использовать для других целей.
DateTimeFormatter
, LocalDateTime
и OffsetDateTime
являются частью JSR-310. Они встроены в Java 8 и позже. Вы также можете использовать их в Java 6 и 7 через ThreeTen Backport . Существует также специальная версия бэкпорта для Android: ThreeTenABP .