SimpleDateFormat parse 2018-11-08_21h34m46sZ - PullRequest
0 голосов
/ 09 ноября 2018

Привет хочу преобразовать время UTC в местное время, и я делаю это

public class TimeZoneN {
    public static void main( String[] args ) throws ParseException {

    String timeStr1 = "2018-11-08_21h34m46sZ";

    String formatStr1 = "yyyy-MM-dd_HH'h'mm'm'ss's'Z";

    SimpleDateFormat formatter = new SimpleDateFormat( formatStr1 );
    formatter.setTimeZone( TimeZone.getTimeZone( "UTC" ) );

    Date date1 = formatter.parse( timeStr1 );
    System.out.println( date1 );

    }
}

я получаю исключение синтаксического анализа, потому что od Z, но когда я делаю

String formatStr1 = "yyyy-MM-dd_HH'h'mm'm'ss'sZ'";

Проходит, правда ли это? Разве это не рассматривает sZ как одну константу, а не Z как маркер часового пояса?

1 Ответ

0 голосов
/ 10 ноября 2018

Вы правы, что Z обозначает зулусское время , другое имя для UTC.Вы также можете думать об этом как о нулевом смещении от UTC.Поэтому вам нужно будет проанализировать Z как смещение, чтобы убедиться, что ваше время интерпретируется правильно.

java.time

Однако не используйте SimpleDateFormat.Это общеизвестно хлопотно и давно устарело.Также не используйте Date, он слишком устарел и имеет проблемы с дизайном.

    DateTimeFormatter formatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd_H'h'm'm's's'X");
    String timeStr1 = "2018-11-08_21h34m46sZ";
    Instant instant1 = formatter.parse(timeStr1, Instant::from);
    System.out.println(instant1);

Вывод:

2018-11-08T21: 34: 46Z

Ради полноты:

хочу преобразовать ... в местное время

Взяв Америку / Торонто в качестве случайного примера:

    ZonedDateTime dateTime = instant1.atZone(ZoneId.of("America/Toronto"));
    System.out.println(dateTime);

Вывод:

2018-11-08T16: 34: 46-05: 00 [Америка / Торонто]

В комментарии выспросил о Z:

какая разница, если я вообще не включу ее?

Две вещи:

  • ВыВы хотите убедиться, что строка содержит требуемое смещение и объект, если нет, или вы рискуете, чтобы ошибки прошли незамеченными.Это называется проверкой ввода.
  • Как я уже говорил, вы хотите проанализировать Z как смещение или вы не можете извлечь однозначный момент времени из проанализированных значений.

Ссылка: Учебное пособие по Oracle: Дата и время , объясняющее, как использовать java.time.

...