Вы правы, что 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
.