Строка формата 2018-11-26T15: 12: 03.000-0800 в java.time.localdatetime формата "M / dd / yy HH: mm: ss az" исключение выброса преобразования - PullRequest
0 голосов
/ 11 декабря 2018

я написал функцию util для преобразования строкового значения времени в формате 2018-11-26T15: 12: 03.000-0800 в локальное время в формате «М / дд / гг чч: мм: сс аз»

строка формата 2018-11-26T15: 12: 03.000-0800 в java.time.localdatetime формата "M / dd / yy HH: mm: ss az" исключение выброса преобразования.

public static LocalDateTime convertStringToTime(String time){
    String pattern = "M/dd/yy HH:mm z";
    DateTimeFormatter formatter =  DateTimeFormatter.ofPattern(pattern);
    ZonedDateTime zonedDateTime = ZonedDateTime.parse(time,formatter);
    return zonedDateTime.toLocalDateTime();
}

, которое даетмне ниже исключение

java.time.format.DateTimeParseException: Text '2018-11-26T12:45:23.000-0800' could not be parsed at index 4
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947)

1 Ответ

0 голосов
/ 11 декабря 2018

Вы говорите, что хотите: LocalDateTime формата M/dd/yy HH:mm:ss a z.Это невозможно по трем причинам:

  1. A LocalDateTime не может иметь формат.Его метод toString всегда возвращает строку типа 2018-11-26T15:12:03 (формат ISO 8601), мы никак не можем это изменить.Вы также не должны хотеть LocalDateTime с определенным форматом;Внизу я включаю ссылку, объясняющую, почему нет.
  2. Я предполагаю, что под z в вашем формате вы подразумеваете сокращение часового пояса, например PDT для тихоокеанского летнего времени.A LocalDateTime также не имеет смещения UTC и не часового пояса, поэтому это не имеет смысла.
  3. Ваша введенная временная строка также не содержит никакого часового пояса, только смещение от 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();

Она длиннее, но менее подвержена ошибкам.

Ссылки

...