Вы говорите, что хотите: LocalDateTime
формата M/dd/yy HH:mm:ss a z
.Это невозможно по трем причинам:
- A
LocalDateTime
не может иметь формат.Его метод toString
всегда возвращает строку типа 2018-11-26T15:12:03
(формат ISO 8601), мы никак не можем это изменить.Вы также не должны хотеть LocalDateTime
с определенным форматом;Внизу я включаю ссылку, объясняющую, почему нет. - Я предполагаю, что под
z
в вашем формате вы подразумеваете сокращение часового пояса, например PDT
для тихоокеанского летнего времени.A LocalDateTime
также не имеет смещения UTC и не часового пояса, поэтому это не имеет смысла. - Ваша введенная временная строка также не содержит никакого часового пояса, только смещение от UTC.Таким образом, чтобы напечатать сокращение часового пояса, вам сначала нужно будет выбрать часовой пояс.
Вместо этого я предлагаю:
ZoneId zone = ZoneId.of("America/Whitehorse");
DateTimeFormatter inputFormatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXX");
DateTimeFormatter desiredFormatter
= DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT, FormatStyle.LONG)
.withLocale(Locale.US);
String time = "2018-11-26T15:12:03.000-0800";
OffsetDateTime dateTime = OffsetDateTime.parse(time, inputFormatter);
String formattedDateTime = dateTime.atZoneSameInstant(zone)
.format(desiredFormatter);
System.out.println("Converted format: " + formattedDateTime);
Вывод:
Преобразованный формат: 26.11.18, 15:12 PST
Чтобы преобразовать дату и время из строки в одном формате в строку в другом формате, обычно требуется два DateTimeFormatter
s: один указывает формат строки, которую вы получили, а другой указывает требуемый формат.
Вместо того, чтобы создавать свой собственный форматер из строки шаблона формата, полагайтесь на встроенные форматы, когда вы можете,В нашем случае я указываю FormatStyle.SHORT
для даты (с указанием двухзначного года) и FormatStyle.LONG
для времени, что дает нам сокращение часового пояса.
Идея использования встроенных форматов можетсделать еще один шаг вперед.Полученная строка имеет формат ISO 8601, поэтому нам просто нужно соединить две части:
DateTimeFormatter inputFormatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.appendOffset("+HHmm", "Z")
.toFormatter();
Она длиннее, но менее подвержена ошибкам.
Ссылки