Как отформатировать дату в часах с SimpleDateFormat в Android? - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть следующая дата

2020-02-05T03:17:04.000Z

И я пытаюсь преобразовать это в час, и результат должен быть 22:17, но в моем приложении я получаю 03: 17

Итак, это мой код

public static String hour_visit(String hora){
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
        Date convertedDate = new Date();
        String fecha_convert = "";
        try {
            convertedDate = dateFormat.parse(hora);
            SimpleDateFormat sdfnewformat = new SimpleDateFormat("HH:mm");
            fecha_convert = sdfnewformat.format(convertedDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return fecha_convert;
    }

Что я делаю не так?

Важно:

В моем веб-приложении я получаю 22:17 Мой часовой пояс - Южная Америка

Ответы [ 4 ]

1 голос
/ 05 февраля 2020

Поиск во всех сообщениях inte rnet Я решил мою проблему, добавив следующее:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
0 голосов
/ 05 февраля 2020

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

Поместите свое время в строку, затем разделите ее

String full_dat_tym_buy = "2020-02-05T03:17:04.000Z";
String[] spiltby_T_buy = full_dat_tym_buy.split("T");
date_buy = spiltby_T_buy[0].trim();
String tym_wid_Z_buy = spiltby_T_buy[1].trim();
String spiltby_Dot1_buy = tym_wid_Z_buy.replace(".000Z", "");
replace_tym_buy = spiltby_Dot1_buy.replace(":", "-");
Log.e("replacetime", replace_tym_buy);

, затем отформатируйте дату, используя часовой пояс, попробуйте

{

String FinalDate = getOnlyDate( replace_tym_buy);
Log.e("difference", String.valueOf(FinalDate));


} catch (Exception exception) {

}

Добавьте этот метод в ваш класс

private String getOnlyDate(String OurDate_) {
String chk_date = OurDate_;
Log.e("datededde", chk_date);
try {
    SimpleDateFormat formatter = new SimpleDateFormat("HH-mm-ss");
    formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
    Date value = formatter.parse(OurDate_);

    SimpleDateFormat dateFormatter = new SimpleDateFormat("HH:mm"); //this format changeable
    Log.e("time: ", TimeZone.getDefault() + "");
    dateFormatter.setTimeZone(TimeZone.getDefault());
    OurDate_ = dateFormatter.format(value);
    Log.e("OurDate_", OurDate_);
} catch (Exception e) {
    OurDate_ = chk_date;
}
return OurDate_;

}
0 голосов
/ 05 февраля 2020

java .time и ThreeTenABP

    DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm");

    String instantString = "2020-02-05T03:17:04.000Z";

    Instant i = Instant.parse(instantString);
    ZonedDateTime dateTime = i.atZone(ZoneId.systemDefault());
    String fechaConvert = dateTime.format(timeFormatter);

    System.out.println("Converted time: " + fechaConvert);

Я запустил этот фрагмент с моим часовым поясом JVM, установленным в Америку / Гуаякиль (время в Эквадоре), и получил:

Преобразовано время: 22: 17

(Многие другие часовые пояса используются в разных частях Южной Америки.)

Ваша строка на мгновение в формате ISO 8601 (точка в время). Instant.parse() ожидает этот формат, поэтому нам не нужен явный форматер для синтаксического анализа.

Классы даты и времени, которые вы пытались использовать, SimpleDateFormat и Date, плохо разработаны и давно устарели, бывший особенно печально известен. Вместо этого я использую java .time, современный Java API даты и времени. Честно говоря, мне гораздо приятнее работать с ним.

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

Одна из многих запутанных черт SimpleDatFormat заключается в том, что он рад разбирать только столько данной строки, как он может и молчаливо игнорировать остальное. Z в вашей строке говорит нам, что дата и время указаны в UT C, но ваш SimpleDateFormat игнорирует этот важный факт. Поэтому он анализирует дату и время, как если бы они были в вашем часовом поясе. Затем второй экземпляр SimpleDateFormat форматирует неверное время и возвращает время, которое было в строке, 03:17 (в этом примере).

Как сказал Андреас, с уровня API 24 SimpleDateFormat можно правильно разобрать Z. На более низких уровнях API это невозможно. В отличие от этого java .time был портирован и работает на более низких уровнях API.

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

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

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

Ссылки

0 голосов
/ 05 февраля 2020

В вашем шаблоне SimpleDateFormat отсутствует X в конце, поэтому он правильно анализирует Z в конце ввода.

Тест

String hora = "2020-02-05T03:17:04.000Z";
Date convertedDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX").parse(hora);
System.out.println(new SimpleDateFormat("HH:mm").format(convertedDate));

Выход (в восточном часовом поясе США)

22:17

ОБНОВЛЕНИЕ

Так как для шаблона X требуется API уровня 24+ в Android, а шаблоны Z и z не поддерживают суффикс зоны Z в строке даты, альтернатива состоит в том, чтобы вводить значение Z и заставить анализатор использовать UT C часовой пояс для разбора.

Test

String hora = "2020-02-05T03:17:04.000Z";

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date convertedDate = dateFormat.parse(hora);

SimpleDateFormat sdfnewformat = new SimpleDateFormat("HH:mm");
System.out.println(sdfnewformat.format(convertedDate));

Выход (в восточном часовом поясе США)

22:17
...