Как сгенерировать локализованную дату и время из 20201023T200457Z и из EEE MMM dd HH:mm:ss zzz yyyy?

У меня есть эта начальная дата и время: 20201023T200457Z (кажется, UTC0000), как я могу преобразовать/сгенерировать ее с помощью этого шаблона yyyyMMdd HH:mm:ss по местному времени на мобильном телефоне?

Я получаю этот результат: Пт, 23 октября, 20:04:57 по Гринвичу + 02:00 2020 с этим кодом:

    SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'", Locale.getDefault());
    Date startGMTInput = df.parse(start);
    Log.e(TAG, "start: " + startGMTInput.toString());// -> Fri Oct 23 20:04:57 GMT+02:00 2020

Но моя цель - получить: 2020-10-23 22:04:57 //потому что я нахожусь в часовом поясе GMT+2


person froniq    schedule 22.10.2020    source источник
comment
Что ж, вы можете использовать SimpleDateFormat для анализа дат форматирования и, поэтому просто создайте еще один с нужным вам шаблоном.   -  person Thomas    schedule 23.10.2020
comment
Используйте 1_.   -  person MC Emperor    schedule 23.10.2020
comment
В качестве отступления подумайте о том, чтобы выбросить давно устаревшие и заведомо неприятные SimpleDateFormat и их друзей. Посмотрите, можете ли вы использовать дешугаринг или добавить ThreeTenABP в свой проект Android, чтобы использовать java.time, современный API даты и времени Java. С ним намного приятнее работать.   -  person Ole V.V.    schedule 23.10.2020


Ответы (2)


java.time либо через дешугаринг, либо через ThreeTenABP

Рассмотрите возможность использования java.time, современного API даты и времени Java, для работы с датой и временем. Давайте сначала определим форматтеры, которые нам нужны:

private static final DateTimeFormatter inputFormatter
        = DateTimeFormatter.ofPattern("uuuuMMdd'T'HHmmssX");
private static final DateTimeFormatter outputFormatter
        = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss");

( DateTimeFormatter является потокобезопасным, поэтому мы можем безопасно объявить их статическими.) Выполните явное преобразование часового пояса:

    String startString = "20201023T200457Z";
    Instant start = inputFormatter.parse(startString, Instant.FROM);
    String target = start.atZone(ZoneId.systemDefault()).format(outputFormatter);
    System.out.println(target);

Вывод в моем часовом поясе (в настоящее время со смещением +02:00, как у вас):

20201023 22:04:57

Вопрос: Разве для java.time не требуется Android API уровня 26?

java.time прекрасно работает как на старых, так и на новых устройствах Android. Просто требуется как минимум Java 6.

  • В Java 8 и более поздних версиях, а также на более новых устройствах Android (начиная с уровня API 26) современный API встроен. Только в этом случае используйте ссылку на метод Instant::from вместо константы Instant.FROM.
  • В не-Android Java 6 и 7 получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. ссылки внизу).
  • На более старых версиях Android используйте либо дешугаринг, либо версию ThreeTen Backport для Android. Он называется ThreeTenABP. В последнем случае убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

person Ole V.V.    schedule 23.10.2020
comment
Спасибо за отличные идеи и ссылки! Наконец я нашел решение без использования java8 и внешних библиотек для обратной совместимости. Сначала я преобразовал входной формат с помощью SimpleDateFormat, затем установил часовой пояс в GMT, а еще один SimpleDateFormat преобразовал в выходной формат. - person froniq; 24.10.2020

Установите свой часовой пояс на GMT+2 перед любыми операциями с датами.

isoFormat.setTimeZone(TimeZone.getTimeZone("GMT+2"));
person ganeshbhargav    schedule 22.10.2020
comment
Сомневаюсь поможет ли. Не могли бы вы продемонстрировать на полном примере, что так и будет? И/или еще лучше, объясните подробнее как? - person Ole V.V.; 23.10.2020