Почему Java говорит мне "" является действительной датой? - PullRequest
1 голос
/ 14 июля 2011

Итак, это то, что я использую как мой isDate в Java.

public class Common {
    public static final String DATE_PATTERN = "yyyy-MM-dd";

    public static boolean isDate(String text) {
        return isDate(text, DATE_PATTERN);
    }

    public static boolean isDate(String text, String date_pattern) {
        String newDate = text.replace("T00:00:00", "");
        SimpleDateFormat formatter = new SimpleDateFormat(date_pattern);
        ParsePosition position = new ParsePosition(0);
        formatter.parse(newDate, position);
        formatter.setLenient(false);
        if (position.getIndex() != newDate.length()) {
            return false;
        } else {
            return true;
        }
    }
}

Вот мой тестовый код:

String fromDate = "";

if (Common.isDate(fromDate)) {
    System.out.println("WHAT??????");
}

Я вижу WHAT??????, напечатанный каждый раз.Что мне здесь не хватает?

Спасибо.

Ответы [ 3 ]

6 голосов
/ 14 июля 2011

Это потому, что ваша логика неверна. newDate="", т.е. newDate.length()==0. Как и position.getIndex()==0, так как ошибка происходит в самом начале строки. Вы можете проверить, является ли position.getErrorIndex()>=0.

2 голосов
/ 14 июля 2011

Правильный способ проверить успешность разбора - посмотреть, возвращает ли метод parse Date или null.Попробуйте это:

public static boolean isDate(String text, String date_pattern) {
    String newDate = text.replace("T00:00:00", "");
    SimpleDateFormat formatter = new SimpleDateFormat(date_pattern);
    ParsePosition position = new ParsePosition(0);
    formatter.setLenient(false);
    return formatter.parse(newDate, position) != null;
}
0 голосов
/ 14 июля 2011

Не изобретайте велосипед ... используйте Joda Time ;)

    DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd");
    try {
        DateTime dt = fmt.parseDateTime("blub235asde");
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
        return false;
    }
    return true;

Вывод:

java.lang.IllegalArgumentException: Invalid format: "blub235asde"
    at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:673)
    at Test.main(Test.java:21)
...