Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么无效日期成功解析为真实日期?_Java_Date_Formatting_Simpledateformat - Fatal编程技术网

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

Java 为什么无效日期成功解析为真实日期?,java,date,formatting,simpledateformat,Java,Date,Formatting,Simpledateformat,有人能解释一下如何让下面的方法为显示的输入返回值false?它返回了true,这是我没有预料到的 isDateValid("19/06/2012 5:00, 21:00","dd/MM/yyyy HH:mm") 我认为这应该返回false,但显然Java不这么认为。提供的实际日期字符串末尾包含以下额外字符:“,21:00” parse不一定使用整个字符串。这在我的重点中非常清楚: parse public Date parse(字符串源)抛出ParseException 解析给定字符串开头的文

有人能解释一下如何让下面的方法为显示的输入返回值
false
?它返回了
true
,这是我没有预料到的

isDateValid("19/06/2012 5:00, 21:00","dd/MM/yyyy HH:mm")
我认为这应该返回
false
,但显然Java不这么认为。提供的实际日期字符串末尾包含以下额外字符:
“,21:00”


parse
不一定使用整个
字符串。这在我的重点中非常清楚:

parse

public Date parse(字符串源)抛出ParseException

解析给定字符串开头的文本以生成日期该方法不能使用给定字符串的整个文本。 有关日期解析的更多信息,请参见方法


通过使用,可以检测字符串末尾是否有额外字符。如果
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();
  }
}
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();
  }
}