Создайте локализованную строку даты из строки даты и времени ISO - PullRequest
0 голосов
/ 15 января 2020

У меня есть требование, при котором мне нужно визуализировать локализованную дату и время в текстовом представлении в макете Android. Дата и время возвращаются в формате ISO из сервисного вызова. Вот ответ JSON

{
   "expiredTime": "2020-01-24T00:59:59.000-05:00",
  . . . Other Keys and Values . . .
}

Это должно быть отображено в приложении Android внутри текстового представления. Что я хочу сделать, это показать локализованное время в приложении. Поэтому, если бы пользователь мог видеть на экране, скажем, в Нью-Йорке, истекшее время показывало бы 2020-01-24T00:59:59.000-05:00, потому что время в полезной нагрузке принадлежит тому же часовому поясу, что и в Нью-Йорке. Точно так же, если бы я хотел отображать в GMT, время было бы показано как 2020-01-24T05:59:59.000-00:00.

Как я могу правильно реализовать это в Android? Я сделал это, как показано ниже. Возвращенная дата передается экземпляру SimpleDateFormat для возврата строки.

public static final Date parse(String dateTimeAsString) throws ParseException
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
        {
            DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME.withLocale(Locale.getDefault()));
            try
            {
                LocalDate localDate = LocalDate.parse(value, formatter);
                if (localDate != null)
                    return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
            } catch (DateTimeParseException dtpe)
            {
                // If the format is invalid, then delegate to the other helper function.
            }
        }
        return null;
    }

Мои вопросы заключаются в следующем:

  1. Правильна ли моя реализация для получения локализованной даты? Если нет, то как бы я сделал это правильно?
  2. Как локализовать дату для Android версии ОС ниже Oreo? DateTimeFormatter доступен только в Android Oreo и выше.

1 Ответ

1 голос
/ 18 января 2020
public static final ZonedDateTime parse(String dateTimeAsString) {
    try {
        return OffsetDateTime.parse(dateTimeAsString).atZoneSameInstant(ZoneId.systemDefault());
    } catch (DateTimeParseException dtpe) {
        return delegateToOtherHelperFunction(dateTimeAsString);
    }
}

Пример использования:

    String expiredTime = "2020-01-24T00:59:59.000-05:00";
    System.out.println(parse(expiredTime));

Вывод в моем часовом поясе:

2020-01-24T06: 59: 59 + 01: 00 [Европа / Копенгаген ]

По вашим вопросам:

  1. Является ли моя реализация правильной локализованной даты? Если нет, то как бы я сделал это правильно?

Нет, есть несколько проблем с вашей реализацией. Я приветствую использование java .time, современного Java API даты и времени, однако.

  • Возвращение Date не даст вам время в каком-либо конкретном часовом поясе. У Date нет часового пояса. Это только момент времени.
  • A LocalDate - это дата без времени суток, поэтому при использовании этого класса вы теряете часть времени.
  • Неважно, DateTimeFormatter.ISO_DATE_TIME - это одинаковые во всех локалях, поэтому применение локали к ней не имеет значения.
Как локализовать дату для Android версии ОС ниже Oreo? DateTimeFormatter доступен только в Android Oreo и выше.

Используйте бэкпорт. java .time был перенесен с Java 8 на Java 6 и 7, а бэкпорт дополнительно адаптирован к ранним Android уровням API. Смотрите ссылки ниже. Если вы пишете приложение, которое будет поддерживаться в нескольких версиях ОС, я предлагаю просто использовать бэкпорт везде (он также работает на высоких уровнях API). Я написал код выше для бэкпорта, чтобы он работал. (Я ожидаю, что он будет работать и со встроенными классами, не проверял).

Замечание по использованию: в вычислительной технике локализовано обычно означает адаптированный к языку пользователей (и частично их культуру) ), их так называемая локаль , а не их часовой пояс. Язык и часовой пояс являются ортогональными понятиями.

Ссылки

...