Проблема с ISO 8601 в Android API уровня 23

У меня проблема в формате java для ISO 8601, я использую этот код

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
//yyyy-MM-dd'T'HH:mm:ss.shh:mm
Date date = Calendar.getInstance().getTime();
String cDate = format.format(date);
Log.d("Date","Date is " + cDate);

Мой результат:

Date is 2019-04-03T04:37:52+0000

если я использую этот формат yyyy-MM-dd'T'HH:mm:ssZ. И результат:

Date is 2019-04-03T04:49:33.3304:49

если я использую этот формат yyyy-MM-dd'T'HH:mm:ss.shh:mm. Я пробовал свои решения, но не дал мне желаемого решения. Мое желаемое решение 2008-09-15T15:53:00+05:00. Я пробую Offset, но он не работает для уровня API 23, он работает только для уровня API 28.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
297
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вот маска формата, которую вы должны использовать:

yyyy-MM-dd'T'HH:mm:ssXXX

Из документация для SimpleDateFormat мы видим, что X представляет часовой пояс ISO 8601, который показывает часовой пояс в часах, сдвинутых от GMT.

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
format.setTimeZone(TimeZone.getTimeZone("Africa/Cairo"));
Date date = Calendar.getInstance().getTime();
String cDate = format.format(date);
System.out.println("Date is " + cDate);

Date is 2019-04-03T06:41:30+02:00

Обратите внимание, что мне нужно было назначить часовой пояс, отличный от GMT, потому что GMT просто возвращает Z для часового пояса.

Спасибо за редактирование моего вопроса и ваш уважаемый ответ, но приложение вылетает и показывает неизвестный символ шаблона «X».

Rana Ali Waseem 03.04.2019 07:09

Это работает в этой демонстрации Java. AFAIK Android работает на форке Java 7, поэтому я удивлен, что приведенный выше код у вас не работает.

Tim Biegeleisen 03.04.2019 07:13

Я только что проверил JavaDoc для Android SDF, и мой код должен работать.

Tim Biegeleisen 03.04.2019 07:14

Я тоже удивлен. :(

Rana Ali Waseem 03.04.2019 07:17

Я дал вам голос. Мой ответ может стать отправной точкой для кого-то, кто может вам помочь.

Tim Biegeleisen 03.04.2019 07:18

Тим, пожалуйста, проверьте это, я просто скопирую ваш код и вставлю в новую область, но вы можете посетить его ideone.com/I6HRGd, почему он показывает ошибку. Поскольку я не импортирую import java.text.*; В моем приложении для Android я использую import android.support.v7.app.AppCompatActivity; импортировать android.os.Bundle; импортировать java.text.SimpleDateFormat; импортировать java.util.Calendar; импортировать java.util.Date; импортировать java.util.TimeZone; муравей проблема с этим?

Rana Ali Waseem 03.04.2019 07:25

Вам не хватает импорта: import java.text.*;

Tim Biegeleisen 03.04.2019 07:28

Насколько я знаю, нет. Пакет java.text должен быть частью кода Android Java SDK. Вам просто нужен этот оператор import в исходном файле с использованием SimpleDateFormat.

Tim Biegeleisen 03.04.2019 07:32

На данный момент я не могу дать никакого другого совета, не сев перед вашей Android Studio (чего я, очевидно, не могу сделать). Возможно, кто-то другой сможет полностью решить вашу проблему.

Tim Biegeleisen 03.04.2019 07:37

В документации указано, что буква шаблона X для часовых поясов ISO-8601 поддерживается только на уровне API 24 и выше. OP пытается запустить это на уровне API 23.

Michael 03.04.2019 10:40

@Michael Спасибо, что разъяснили это. Но в будущем большинство пользователей Android, вероятно, будут на уровне 24 или выше (я думаю).

Tim Biegeleisen 03.04.2019 10:54
Ответ принят как подходящий

Тим был прав, но данный шаблон работает для java, а не для той java, которая есть в андроиде. Для Android java используйте этот шаблон

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ");

Тогда выход будет

Date is 2019-04-03T08:29:27+00:00

Другие вопросы по теме