为什么无效日期会成功解析为真实日期?

Why does an invalid date parses successfully as a real date?

提问人:Joe 提问时间:8/23/2015 最后编辑:durron597Joe 更新时间:8/23/2015 访问量:80

问:

有人可以向我解释如何获得以下方法来返回所显示输入的值吗?它回来了,这是我没想到的。falsetrue

isDateValid("19/06/2012 5:00, 21:00","dd/MM/yyyy HH:mm")

我认为这应该返回,但显然 Java 不这么认为。提供的实际日期字符串末尾包含以下额外字符:.false", 21:00"

public static boolean isDateValid(String date, String dateFormat) 
{
        try {
            DateFormat df = new SimpleDateFormat(dateFormat);
            df.setLenient(false);
            Date newDate = df.parse(date);
            System.out.println("Date value after checking for validity: " + newDate);
            return true;
        } catch (ParseException e) {
            return false;
        }
}
Java 日期 格式 simpledateformat

评论


答:

7赞 durron597 8/23/2015 #1

parse不一定使用整个.这在 Javadoc 中非常清楚,强调我的:String

parse

public Date parse(String source) throws ParseException

分析给定字符串开头的文本以生成日期。该方法不能使用给定字符串的整个文本。有关日期分析的详细信息,请参阅 parse(String, ParsePosition) 方法。


您可以使用 parse(String text, ParsePosition pos) 检测字符串末尾是否有额外的字符。如果不等于 String 的末尾,则末尾剩余有额外的字符。pos

这是一个工作程序,包括测试台,它将按照您预期的方式正确检查这一点。在这个程序中,如果它根本无法解析,如果末尾有额外的字符,则数字太小,如果它按照你想要的方式工作,则相等pos.getIndex()0

public class DateFormatTest {
  public static void main(String[] args) {
    // should be false
    System.out.println(isDateValid("19/06/2012 5:00, 21:00", "dd/MM/yyyy HH:mm"));
    System.out.println(isDateValid("19/06/201", "dd/MM/yyyy HH:mm"));
    
    System.out.println();
    
    // should be true
    System.out.println(isDateValid("19/06/2012 5:00", "dd/MM/yyyy HH:mm"));
  }

  public static boolean isDateValid(String date, String dateFormat) {
    ParsePosition pos = new ParsePosition(0);
    DateFormat df = new SimpleDateFormat(dateFormat);
    df.setLenient(false);
    df.parse(date, pos);

    return pos.getIndex() == date.length();
  }
}