парсинг даты / времени в localtimezone - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь проанализировать дату / время json со стороны сервера внутри окна просмотра bind. Строка даты, которую я пытаюсь проанализировать, такова:

2018-06-25T08:06:52Z

Вот код, который я использую (полученный из другого потока переполнения стека)

  try {


           SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ENGLISH);
           df.setTimeZone(TimeZone.getTimeZone("Africa/Nairobi"));
           Date date = df.parse(timeToConvert);
           df.setTimeZone(TimeZone.getDefault());
           String formattedDate = df.format(date);
           String trimmed = formattedDate.substring(11,16);
           myViewHolder.date_TV.setText(trimmed);

       }catch (Exception e){

       }

Однако это не работает, время, установленное для текстового представления, такое же, как и до разбора.

Ответы [ 2 ]

0 голосов
/ 06 июля 2018
    String timeToConvert = "2018-06-25T08:06:52Z";
    Instant inst = Instant.parse(timeToConvert);
    LocalTime time = inst.atZone(ZoneId.of("Africa/Nairobi"))
            .toLocalTime()
            .truncatedTo(ChronoUnit.MINUTES);
    System.out.println("Time in Nairobi: " + time);

Это печатает:

Время в Найроби: 11: 06

Я использую java.time, в данном случае это бэкпорт для Java 6 и 7. Этот бэкпорт также доступен в версии для Android, которую вы можете использовать для низких уровней API Android. Мой импорт:

import org.threeten.bp.Instant;
import org.threeten.bp.LocalTime;
import org.threeten.bp.ZoneId;
import org.threeten.bp.temporal.ChronoUnit;

Если вам нужна строка времени для API, который требует этот формат, у вас все в порядке. Если вам требуется строка времени для представления пользователю, попробуйте вместо этого использовать встроенный формат Java:

    DateTimeFormatter timeFormatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);
    ZonedDateTime dateTime = inst.atZone(ZoneId.of("Africa/Nairobi"));
    System.out.println("Formatted: " + dateTime.format(timeFormatter));

Я попытался запустить это на языке суахили (sw_KE) и получил:

Отформатировано: 11:06

По-видимому, в этом языковом стандарте используется английский способ отметки времени AM / PM (я получил тот же результат в языковых стандартах Kikuyu и Kalenjin). В английской локали я получаю тот же формат, что и раньше:

Отформатировано: 11: 06

Я использую и предлагаю java.time, современный Java-интерфейс даты и времени. Для тех, кто читает и использует Java 8 или более позднюю версию или программирует для Android API уровня 26 или более поздней, вам не требуется упомянутый бэкпорт. Просто импортируйте встроенные классы даты и времени из java.time с подпакетами вместо вышеупомянутых.

Что пошло не так в вашем коде?

Ваша ошибка происходит из-за жесткого кодирования Z в строке даты и времени в виде литерала. Это смещение UTC, равное нулю, и если вы не проанализируете его как таковой, строка даты и времени будет проанализирована в часовом поясе вашего SimpleDateFormat, Африка / Найроби, что неправильно для вашей строки.

ИМХО, хотя вы вообще не должны использовать SimpleDateFormat, TimeZone и Date. Эти классы давно устарели, и первый, в частности, оказался проблематичным. Я всегда использую java.time вместо.

Еще один совет: не глотайте исключения. Не оставляйте свой блок catch пустым. Сообщите об исключении некоторым заметным способом. Это ваш шанс узнать, что в вашем коде что-то не так.

Ссылки

0 голосов
/ 06 июля 2018

Время, установленное для текстового представления, такое же, как и до разбора.

Это потому, что вы не передаете новый SimpleDateFormat.

Попробуйте это:

final String serverDate = "2018-06-25T08:06:52Z"
final SimpleDateFormat serverDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
final SimpleDateFormat yourDateFormat = new SimpleDateFormat("yyyy-MM-dd"); // put whatever you want here!

try {
    final Date date = serverDate.parse(serverDateFormat);
    final String formattedDate = yourDateFormat.format(date);
} catch (ParseException e) {
    System.out.println(e.toString());
}

Таким образом, вы интерпретируете String с форматом сервера в чистый Date объект. После этого вы можете делать с этим объектом все, что пожелаете, и превращать его в любой формат, который хотите (предоставив свой новый формат).

Подробнее о создании шаблона формата даты см. эту ссылку .

...