ISO 8601
Формат вашей строки соответствует стандарту ISO 8601 .
java.time
Java 8 и более поздние версии включают в себя java.time инфраструктуру для замены старых классов даты и времени, используемых в Вопросе и других Ответах.
Новые классы по умолчанию используют стандарт ISO 8601 при разборе / генерации строк. Так что не нужно указывать шаблон кодированного формата .
Часовой пояс
В вашей входной строке отсутствует часовой пояс или смещение от UTC . Таким образом, вы должны указать часовой пояс, для которого эта строка имеет значение. Если вы не укажете, при разборе автоматически применяется текущий часовой пояс JVM по умолчанию. Не хорошо, так как это значение по умолчанию не может быть зоной, предназначенной для вашей строки. Кроме того, настройки JVM по умолчанию могут измениться в любой момент, даже во время выполнения.
Если UTC
Если ваша строка предназначена для UTC в качестве часового пояса, просто добавьте Z
(сокращение от «Zulu», что означает UTC). Затем проанализируйте как Instant
, момент времени на UTC.
String input = "2008-08-01T15:47:00.557";
Instant instant = Instant.parse ( input + "Z" );
Дамп на консоль.
System.out.println ( "instant: " + instant );
мгновенный: 2008-08-01T15: 47: 00.557Z
Если часовой пояс
Если ваша строка предназначена для какого-то другого часового пояса, нам нужно указать. Используйте правильное название часового пояса (никогда не используйте 3-4 буквенные коды в прессе). Здесь мы произвольно выбираем часовой пояс Монреаля.
Для шаблона форматирования мы используем один из предопределенных форматов для ISO 8601: DateTimeFormatter.ISO_LOCAL_DATE_TIME
(«LOCAL» означает отсутствие часового пояса или смещения, встроенных во входную строку).
String input = "2008-08-01T15:47:00.557";
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
formatter = formatter.withZone ( zoneId );
ZonedDateTime zdt = ZonedDateTime.parse ( input , formatter );
Дамп на консоль. Мы также извлекаем Instant
из ZonedDateTime
, чтобы вы могли увидеть тот же момент в UTC. Обычно лучше всего работать в UTC в своей бизнес-логике; применять только часовой пояс для вывода для пользователя.
System.out.println ( "input: " + input + " | zdt: " + zdt + " | instant of zdt: " + zdt.toInstant () );
ввод: 2008-08-01T15: 47: 00.557 | zdt: 2008-08-01T15: 47: 00.557-04: 00 [Америка / Монреаль] | момент времени от: 2008-08-01T19: 47: 00.557Z