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 достаточно?

Другие вопросы по тегам