Как заставить работать SimpleDataFormat с летним временем? - PullRequest
0 голосов
/ 11 апреля 2019

Я получаю дату от сервера в формате iso8601 serverTimeDateFormat.parse("2019-04-10T16:04:14.677Z"), когда я анализирую дату, она дает время, соответствующее моему местоположению, но оно отстает на 1 час (GMT + 1, а GMT + 2). Чторешение для этого?Как я могу считать, что был переход на летнее время, но все же он рассчитывает на основе зимнего времени

1 Ответ

1 голос
/ 11 апреля 2019

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 с подпакетами.

Ссылки

...