Часовой пояс
Лучше всего явно указать, в каком часовом поясе вы хотите выводить:
DateTimeFormatter inputFormatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXX");
DateTimeFormatter displayFormatter = DateTimeFormatter
.ofLocalizedDateTime(FormatStyle.LONG)
.withLocale(Locale.ENGLISH);
ZoneId displayZone = ZoneId.of("Pacific/Pitcairn");
String dt = "2018-09-02T19:12:00-0400";
OffsetDateTime dateTime = OffsetDateTime.parse(dt, inputFormatter);
String displayDateTime = dateTime.atZoneSameInstant(displayZone)
.format(displayFormatter);
System.out.println(displayDateTime);
Это печатает:
2 сентября 2018 года в 15:12 PST
Я использовал часовой пояс Pacific / Pitcairn в своем коде, но вы лучше знаете, какой часовой пояс вы хотите.
Я также использую java.time, современный Java-интерфейс даты и времени. Используемые вами классы даты и времени, SimpleDateFormat
и Date
, считаются давно устаревшими, и с java.time работать намного приятнее.
Что пошло не так в вашем коде?
Ваш способ синтаксического анализа вашей строки даты верен и выдает правильный Date
.
При печати Date
вы неявно звоните toString
. У устаревшего Date
класса есть своеобразный и запутанный метод toString
: он захватывает настройку часового пояса JVM и использует его для создания строки. Таким образом, в зависимости от вашего часового пояса по умолчанию, вы можете получить любой час дня на выходе. Похоже, настройки часового пояса вашей JVM не соответствуют ожидаемым.
Поскольку вы ожидали 15:12 после ввода 19: 12: 00-0400, я понимаю, что вам нужен часовой пояс со смещением -08: 00 от UTC в сентябре. Например, если вашим часовым поясом по умолчанию был America / Los_Angeles, стандартное время которого - -08: 00, вы получите Sun Sep 02 16:12:00 PDT 2018
, потому что летнее время (летнее время) действует в Калифорнии в сентябре, поэтому смещение составляет -07: 00
Использование часового пояса JVM по умолчанию всегда нестабильно, поскольку этот параметр может быть изменен в любое время другими частями вашей программы или другими программами, работающими в той же JVM.
Вопрос: можно ли использовать java.time на Android?
Да, java.time
прекрасно работает на старых и новых устройствах Android. Просто требуется хотя бы Java 6 .
- В Java 8 и более поздних версиях и на более новых устройствах Android (от 26 уровня API, как мне сказали) современный API встроен.
- В Java 6 и 7 получить ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310; см. Ссылки внизу).
- На (более старой) версии Android используется версия Android ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
Ссылки