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

时间:2015-08-22 22:19:45

标签: java date formatting simpledateformat

有人可以向我解释如何使用以下方法为显示的输入返回值false吗?它正在返回true,这是我不期望的。

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

我认为这应该返回false,但显然Java并不这么认为。提供的实际日期字符串最后包含这些额外字符:", 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;
        }
}

1 个答案:

答案 0 :(得分:7)

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

  

parse

     

public Date parse(String source) throws ParseException

     

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

您可以使用parse(String text, ParsePosition pos)检测字符串末尾是否有额外的字符。如果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(); } } ,如果最后有额外的字符,则数字太小,如果它按照您想要的方式工作则相等/ p>

Str strTopLeftCellIdentifier = "Account No"