Это потому, что вы говорите парсеру игнорировать Z
, точнее, буквально сопоставлять его, а не обрабатывать , что означает .
Входные строки Instant
значений, поэтому проанализируйте Instant
, , а затем примените часовой пояс.
Если у вас нет совместимого с Java 8+ Android, используйте ThreeTenABP .
String stTime = "2018-10-17T22:00:00Z";
ZonedDateTime time = Instant.parse(stTime).atZone(ZoneId.of("America/New_York"));
System.out.println(time); // prints: 2018-10-17T18:00-04:00[America/New_York]
Если вы предпочитаете использовать устаревшие SimpleDateFormat
, просто используйте правильный формат и не указывайте часовой пояс.
SimpleDateFormat formatStart = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
Date startDate = formatStart.parse(stTime);
// My default time zone is America/New_York, so:
System.out.println(startDate); // prints: Wed Oct 17 18:00:00 EDT 2018
startDate.getTime()
- это нужное вам время в миллисекундах.
Для API уровня <24 шаблон формата <code>X не работает, поэтому вам нужно сделать жестко кодированный Z
, как в вашем вопросе, но сообщить парсеру, что он в UTC, потому что эточто означает Z
часовой пояс.
SimpleDateFormat formatStart = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
formatStart.setTimeZone(TimeZone.getTimeZone("UTC"));
Date startDate = formatStart.parse(stTime);
// My default time zone is America/New_York, so:
System.out.println(startDate); // prints: Wed Oct 17 18:00:00 EDT 2018