Apache date использует parseDateStrictly метод, который не работает должным образом
DateUtils.parseDateStrictly("28 Sep 2018" , "dd MMMM yyyy")
Формат указанной выше даты должен быть дд MMM гггг (MMM означает более короткий месяц), но MMMM также анализирует более короткий месяц, что приводит к недопустимому синтаксическому анализу. Я уже использую метод parseDateStrictly. Есть другие предложения?
3 ответа
java.time
Я рекомендую вам использовать java.time для работы с датой и временем. Apache
DateUtils
было полезно, когда у нас были только плохо спроектированные
Date
и
SimpleDateFormat
классы для работы. Нам это больше не нужно. Давно он нам не нужен.
java.time ведет себя так, как вы ожидаете из коробки.
DateTimeFormatter dateFormatter
= DateTimeFormatter.ofPattern("dd MMMM uuuu", Locale.ENGLISH);
String dateString = "28 Sep 2018";
LocalDate.parse(dateString, dateFormatter);
Результат:
Exception in thread "main" java.time.format.DateTimeParseException: Text '28 Sep 2018' could not be parsed at index 3 at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046) at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948) at java.base/java.time.LocalDate.parse(LocalDate.java:428) (etc.)
Ссылка
Учебник Oracle: Date Time, объясняющий, как использовать java.time.
Формат столбца - дд ММММ гггг, и он должен анализировать даты, например 28 сентября 2018 г., и должен выдавать ошибку для таких значений, как 28 сентября 2018 г.
DateUtils
использует API даты и времени
java.util
и их API форматирования,
SimpleDateFormat
которые устарели и подвержены ошибкам. Я предлагаю вам полностью прекратить их использовать и перейти на современный API даты и времени.
Используя современный API даты и времени:
import java.time.DateTimeException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
// Test strings
String[] arr = { "28 September 2018", "28 Sep 2018", "28 09 2018" };
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMMM uuuu", Locale.ENGLISH);
for (String s : arr) {
try {
LocalDate date = LocalDate.parse(s, formatter);
// ...Process date e.g.
System.out.println(DateTimeFormatter.ofPattern("MMMM dd, uuuu", Locale.ENGLISH).format(date));
} catch (DateTimeException e) {
System.out.println(s + " is not a valid string.");
}
}
}
}
Вывод:
September 28, 2018
28 Sep 2018 is not a valid string.
28 09 2018 is not a valid string.
Узнайте больше о современном API даты и времени на Trail: Date Time.
Если вы делаете это для своего проекта Android, а ваш уровень API Android по-прежнему не соответствует Java-8, проверьте API-интерфейсы Java 8+, доступные через десугаринг, а также Как использовать ThreeTenABP в Android Project.
Из приведенных выше комментариев, "28 сентября 2018" не вызовет какой-либо ошибки фазы, если вы хотите отстоять решение, может быть, судить java.lang.String#length достаточно?