Разбор строки в datetime не возвращает правильное время - PullRequest
0 голосов
/ 03 сентября 2018

В Android ... Я ожидаю 3:12 вечера как истечение времени следующего кода, но я получаю 4:12 вечера. Как правильно проанализировать этот формат даты и времени?

String dt = "2018-09-02T19:12:00-0400";
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

try {
    Date date = dateFormat.parse(dt);
    System.out.println(date);
} catch (ParseException e) {
    e.printStackTrace();
}

1 Ответ

0 голосов
/ 04 сентября 2018

Часовой пояс

Лучше всего явно указать, в каком часовом поясе вы хотите выводить:

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

Ссылки

...