- Вы правильно спрашиваете. Вы не должны использовать устаревший метод
parse(String!)
. Мало того, что он устарел по какой-то причине, он также сбивает с толку и, вероятно, оставит читателя вашего кода в недоумении о том, что происходит.
- Вы не должны преобразовывать строку даты в одном формате в строку даты в другом формате. В вашей программе вы должны хранить свою дату как правильный объект даты, а не строку.
- Только что упомянутый правильный объект даты должен быть взят из 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
SimpleDateFormat
иDate
. Эти классы плохо спроектированы и давно устарели, а первые, как известно, доставляют много хлопот. Вместо этого используйтеLocalDate
иDateTimeFormatter
из java.time, современного API даты и времени Java а>. - person Ole V.V.   schedule 13.11.2020LocalDate
для вашей даты. При приеме строкового ввода сначала разберите его наLocalDate
. Только когда вам нужно вывести строку, снова отформатируйтеLocalDate
в строку. - person Ole V.V.   schedule 13.11.2020date: String
? Пожалуйста, приведите пример. Это поможет нам показать вам правильный путь. - person Ole V.V.   schedule 13.11.2020