SimpleDateFormat
не может обрабатывать любое другое количество десятичных знаков в секундах, кроме трех (миллисекунд), поэтому нет никакого способа правильно проанализировать вашу строку. Кроме того, более новые классы даты и времени Java, как правило, гораздо более удобны и понятны для программиста. И они имеют наносекундную точность (9 знаков после запятой в секундах). Поэтому я предлагаю вам подумать о том, чтобы перейти к ним.
Как уже отмечалось, Z означает часовой пояс Зулу, также известный как UTC. Таким образом, 2017-05-11T15:46:48.2226756Z
означает 15:46:48 UTC, что равно 8:46:48 по тихоокеанскому летнему времени. Ваш формат на мгновение является форматом ISO 8601, который класс Instant
понимает как его значение по умолчанию, поэтому синтаксический анализ прост:
Instant instant = Instant.parse(rawDate);
Результат
2017-05-11T15:46:48.222675600Z
Единственное, что следует отметить, это два добавленных нуля. Метод toString
печатает десятичные дроби группами по три, достаточно групп для отображения полной точности. Таким образом, с 7 десятичными знаками будет напечатано 9.
Чтобы получить дату в тихоокеанском часовом поясе:
ZonedDateTime dateTime = instant.atZone(ZoneId.of("America/Los_Angeles"));
В результате получилось то, что я предсказывал:
2017-05-11T08:46:48.222675600-07:00[America/Los_Angeles]
Теперь предположим, что вы получили необработанную строку даты и времени от кого-то, кто неправильно понял и действительно имел в виду четверг, 11 мая, 15:46:48 по тихоокеанскому времени 2017 года (это будет не первый случай в истории). Затем вам нужно преобразовать его в это. Опять же, хотя это было бы громоздко со старомодными классами, с новыми все идет гладко:
ZonedDateTime dateTime = instant.atOffset(ZoneOffset.UTC)
.atZoneSimilarLocal(ZoneId.of("America/Los_Angeles"));
Результат тот, который вы просили (за исключением того, что я также даю вам все десятичные знаки):
2017-05-11T15:46:48.222675600-07:00[America/Los_Angeles]
Для Android вы получаете более новые классы даты и времени из библиотеки ThreeTenABP.
Ссылки
person
Ole V.V.
schedule
26.05.2017
'Z'
как литерал? - person bradimus   schedule 26.05.2017Z
. (2) Вы пытаетесь поместить наносекунды в устаревший класс, который поддерживает только миллисекунды. Оба вопроса уже обсуждались много раз. Искать перед публикацией в Stack Overflow. - person Basil Bourque   schedule 27.05.2017