java.time и ThreeTen Backport
ZoneId myTimeZone = ZoneId.of("Europe/Bratislava");
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG)
.withLocale(Locale.forLanguageTag("sk-SK"));
String serverDateTimeString = "2019-04-10T16:04:14.677Z";
Instant dateTime = Instant.parse(serverDateTimeString);
String formattedWithSummerTime = dateTime.atZone(myTimeZone)
.format(formatter);
System.out.println(formattedWithSummerTime);
Выходные данные из этого фрагмента:
апрель 2019, 18:04:14 SELČ
Даже если вы не говорите по-словацки, вы можете узнать, что серверное время 16:04:14 было преобразовано в18:04:14, то есть GMT + 2 по запросу.Разумеется, вы просто заменяете свой часовой пояс и свой собственный языковой стандарт.
В каких часовых поясах есть летнее время (DST), между которыми даты встроены в Java и не требуют особого внимания с вашей стороны, программиста приложения.Многие европейские часовые пояса (и один африканский) находятся в GMT + 1 обычно и GMT + 2 в летнее время, поэтому я просто выбрал один из них для иллюстрации.
Я очень сознательно избегаю использования SimpleDateFormat
класс, который вы упомянули в своем вопросе (хотя он также знает часовые пояса и летнее время и может быть использован здесь).Этот класс, как известно, хлопотно и к счастью давно устарел.Вместо этого я использую java.time, современный Java-интерфейс даты и времени.
Что тогда пошло не так в вашем коде?Вы не показали это, поэтому я не могу знать, но возможное подозрение, что вы неправильно проанализировали строку сервера.Z
означает UTC, но программисты иногда принимают его как литерал, поэтому SimpleDateFormat
не знает, что проанализированная строка находится в UTC, что приводит к неправильному времени.
Вопрос: Могу ли я использоватьjava.time на Android?
Да, java.time прекрасно работает на старых и новых устройствах Android.Для этого требуется как минимум Java 6 .
- В Java 8 и более поздних версиях и на более новых устройствах Android (от уровня API 26) современный API поставляется встроенным.
- В Java 6 и 7 получают ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
- На (более старых) Android используется версия ThreeTen для AndroidBackport.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
Ссылки