Устаревший анализ даты в Android

Я использую эту функцию для анализа строк в формате даты

 fun formatTimestampEDDMMMYYYY(date: String): String {
    return E_DD_MMM_YYYY.format(Date.parse(date))
}

Хотя он отлично работает, град выдает ошибку с указанием

'parse(String!): Long' is deprecated. Deprecated in Java

Я пытался найти в Google альтернативу, однако многие результаты до 2015 года предлагают сделать это так, как я. Если у кого-то есть какой-то современный способ сделать это, я хотел бы услышать об этом.


person AndroidDev123    schedule 12.11.2020    source источник
comment
Я рекомендую вам не использовать SimpleDateFormat и Date. Эти классы плохо спроектированы и давно устарели, а первые, как известно, доставляют много хлопот. Вместо этого используйте LocalDate и DateTimeFormatter из java.time, современного API даты и времени Java.   -  person Ole V.V.    schedule 13.11.2020
comment
За исключением самых маленьких одноразовых программ, вы не должны переформатировать дату из одной строки в другую строку. В вашей программе используйте LocalDate для вашей даты. При приеме строкового ввода сначала разберите его на LocalDate. Только когда вам нужно вывести строку, снова отформатируйте LocalDate в строку.   -  person Ole V.V.    schedule 13.11.2020
comment
Как выглядит ваш date: String? Пожалуйста, приведите пример. Это поможет нам показать вам правильный путь.   -  person Ole V.V.    schedule 13.11.2020


Ответы (2)


  1. Вы правильно спрашиваете. Вы не должны использовать устаревший метод parse(String!). Мало того, что он устарел по какой-то причине, он также сбивает с толку и, вероятно, оставит читателя вашего кода в недоумении о том, что происходит.
  2. Вы не должны преобразовывать строку даты в одном формате в строку даты в другом формате. В вашей программе вы должны хранить свою дату как правильный объект даты, а не строку.
  3. Только что упомянутый правильный объект даты должен быть взят из java.time, современного API даты и времени Java. Класс Date был плохо спроектирован и давно устарел. Кажется, вы также использовали класс SimpleDateFormat. Это еще хуже, отъявленный возмутитель спокойствия класса. Выбросьте их и используйте вместо них java.time.

Java.время

Я не знаю, как выглядела ваша исходная строка. Я просто беру пример строки и показываю вам, как ее анализировать. В Java:

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("M/d/u");
    String originalDateString = "8/23/2020";
    LocalDate yourDate = LocalDate.parse(originalDateString, dateFormatter);
    System.out.println(yourDate);

Вывод:

2020-08-23

Выберите класс из java.time, который собирает как можно больше информации из строки. Если ваша строка включает время суток, используйте LocalDateTime вместо LocalDate. Если он также включает часовой пояс или смещение от UTC, используйте ZonedDateTime или OffsetDatetime.

Я считаю значительным преимуществом перед вашим кодом то, что этот код явно указывает, какой формат ожидается в строке.

Когда вам нужно вывести строку, отформатируйте ее следующим образом:

    DateTimeFormatter eDdMmmYyyy = DateTimeFormatter.ofPattern("E dd MMM yyyy", Locale.ENGLISH);
    String formattedDate = yourDate.format(eDdMmmYyyy);
    System.out.println(formattedDate);

Вс 23 авг 2020

Date.parse() был волшебным в плохом смысле

Я никогда не знал, чего ожидать от Date.parse(). Он пытался быть дружелюбным и анализировать множество разных форматов, но какие форматы не были хорошо задокументированы, и поведение метода было чрезвычайно трудно предсказать. Когда я достаточно долго изучал документацию, я смог в этом разобраться. Но никому не хочется долго изучать документацию, чтобы разобраться в одной, казалось бы, простой строчке кода.

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

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

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

Ссылки

person Ole V.V.    schedule 13.11.2020
comment
Большое спасибо за ваш подробный ответ, это было очень полезно. - person AndroidDev123; 15.11.2020

fun myFunction(formattedStr: String?): String {
        formattedStr?.let {
            val inputFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
            val outputFormat = SimpleDateFormat("EE, MMMM dd, yyyy h:mm a")
            return outputFormat.format(inputFormat.parse(it))
        }
        return ""
    }

Вы можете попробовать описанную выше функцию. И измените формат даты для вашего требования.

person SoftwareGuy    schedule 12.11.2020
comment
Я рекомендую вам не использовать SimpleDateFormat и Date. Эти классы плохо спроектированы и давно устарели, а первые, как известно, доставляют много хлопот. Вместо этого используйте LocalDate и DateTimeFormatter из java.time, современного API даты и времени Java. - person Ole V.V.; 13.11.2020