java.text.ParseException: Неразборчивая дата: "20: 01: 00.000Z" - PullRequest
0 голосов
/ 25 мая 2019

Я получаю значение для своего поля времени в этом формате "10: 30: 00.000Z".Я хочу преобразовать его в формат 10:30 AM / PM.Я пытаюсь использовать SimpleDateFormat и анализировать его, но получаю исключение java.text.ParseException.Может ли кто-нибудь помочь мне в этом?

Значение treatmentObject.getTime () = "10: 30: 00.000Z"

'' '

if (treatmentObject.getTIME1() != null) {  
System.out.println("Treatment time is"+treatmentObject.getTIME1());  
time1 = toISO8601UTC(fromISO8601UTC(treatmentObject.getTIME1()));
System.out.println("Time1  is" + time1);  
}  

public static String toISO8601UTC(Date date) {
System.out.println("date is::" + date);
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("HH:mm:ss.SSSZZZZZ");
df.setTimeZone(tz);
System.out.println("String date is::" + df.format(date));
return df.format(date);
}  

public static Date fromISO8601UTC(String dateStr) {
System.out.println("dateStr is::" + dateStr);
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("hh:mm a");
df.setTimeZone(tz);
    try {
    System.out.println("parse dateStr is::" + df.parse(dateStr));
    return df.parse(dateStr);
    } catch (ParseException e) {
        System.out.println("Inside catch exception");
        e.printStackTrace();
    }
    return null;
}

' ''

1 Ответ

1 голос
/ 25 мая 2019

java.time

    String treatmentTimeString = "20:01:00.000Z";
    DateTimeFormatter timeFormatter
            = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT)
                    .withLocale(Locale.US);
    OffsetTime treatmentTime = OffsetTime.parse(treatmentTimeString);
    OffsetTime timeInUtc = treatmentTime.withOffsetSameInstant(ZoneOffset.UTC);
    String formattedTime = timeInUtc.format(timeFormatter);
    System.out.println("Treatment time: " + formattedTime);

Выходные данные из этого фрагмента:

Время обработки: 20:01

Я использую Java.time, современный Java API даты и времени.Далее я использую тот факт, что ваша временная строка соответствует ISO 8601, стандартному формату, который классы java.time анализируют (и также печатают) по умолчанию, то есть без какого-либо явного средства форматирования.Для форматирования я использую встроенный в Java локализованный формат.Таким образом, я свободен от написания любой строки шаблона формата, что в противном случае всегда является ошибкой.

Я конвертирую проанализированное время в UTC.В примере это не является необходимым, поскольку Z в строке примера указывает, что оно уже в UTC.Независимо от этого, вы также получите правильное время UTC, если однажды вы получите строку времени с другим смещением.

Вопрос: Могу ли я использовать java.time на уровне API Android 21 уровня?

Это дает ожидаемый результат, но проблема в том, что он работает с минимальным API-уровнем 26. Мой минимальный API-уровень 21. Итак, какой обходной путь?

Да, конечно, Java.время работает хорошо на старых и новых устройствах Android.Для этого требуется как минимум Java 6 .

  • В Java 8 и более поздних версиях и на более новых устройствах Android (начиная с уровня API 26) современный встроенный API.
  • В Java 6 и 7 получают ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • На (более старых) Android используется версия ThreeTen для AndroidBackport.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

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

Кажется, вы поменяли формат, который вы имели, и форматВы хотели.Вы получили 20:01:00.000Z и попытались проанализировать его с помощью средства форматирования с шаблоном формата hh:mm a.Это явно не удалось, за исключением того, что вы сообщили.После этого вы попытались отформатировать Date, который вы ожидали получить при разборе, с помощью средства форматирования с шаблоном форматирования HH:mm:ss.SSSZZZZZ.Если бы вы зашли так далеко, вы бы увидели, что он дал вам 20:01:00.000+0000, а не формат 10:30 AM / PM.

Ссылки

...