Преобразование gmt в ist непарсируемое исключение даты - PullRequest
1 голос
/ 17 марта 2020
DateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
DateFormat indianFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
indianFormat .setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
String output = null;
try {
    Date timestamp = null;
    timestamp = utcFormat.parse(createdAt);
    output = indianFormat.format(timestamp);
} catch (ParseException e) {
    Log.d("ParseError", String.valueOf(e));
}

Я хочу преобразовать время по Гринвичу в формате "2020-03-16T18:50:39.656Z" в время IST того же формата, что и по Гринвичу, но я получаю необъяснимое исключение

Ответы [ 2 ]

1 голос
/ 17 марта 2020

tl; dr

Instant
.parse(
    "2020-03-16T18:50:39.656Z"
)
.atZone(
    ZoneId.of( "Asia/Kolkata" )
)

java .time

Вы используете ужасные классы даты и времени, которые были вытеснены годами go современные java .time классы с принятием JSR 310.

ISO 8601

Ваша входная строка в стандартном формате ISO 8601. Z в конце означает UT C (смещение ноль часов-минут-секунд) и произносится как «зулу».

Классы java .time по умолчанию используют форматы ISO 8601. Поэтому нет необходимости указывать шаблон форматирования.

Instant

Проанализируйте ваш ввод как Instant, представляющий момент, как видно в UT C.

String input = "2020-03-16T18:50:39.656Z" ;
Instant instant = Instant.parse( input ) ;

ZonedDateTime

Отрегулируйте по индийскому времени.

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

О java .time

java .time Фреймворк встроен в Java 8 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Чтобы узнать больше, см. Учебник Oracle . И поиск переполнения стека для многих примеров и объяснений. Спецификация: JSR 310 .

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java .time классы.

Вы можете обмениваться java .time объектами напрямую с вашей базой данных. Используйте драйвер JDB C , совместимый с JDB C 4.2 или более поздней версией. Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где взять классы java .time?

  • Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 и более поздних версий - часть стандартного API Java со связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большинство функций java .time перенесено на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии Android связывают реализации классов java .time .
    • Для более ранних Android (<26) <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP проект адаптируется ThreeTen-Backport (упомянуто выше). См. Как использовать ThreeTenABP… .

Table of which java.time library to use with which version of Java or Android

1 голос
/ 17 марта 2020

Z в конце значения createdAt является символом часового пояса ISO 8601. Чтобы разобрать его, вам нужно иметь X в строке формата даты, а не Z. Измените строку формата даты на "yyyy-MM-dd'T'HH:mm:ss.SSSX", и ваша программа будет работать.

В качестве альтернативы, вы можете сохранить Z в строке формата даты, но указать свой ввод как "2020-03-16T18:50:39.656+0000" - то есть использовать четыре di git число для представления временного смещения на входе вместо Z.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...