以下是一个例子:
public MyDate() throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/d");
sdf.setLenient(false);
String t1 = "2011/12/12aaa";
System.out.println(sdf.parse(t1));
}
2011/12 / 12aaa不是有效的日期字符串。但是,该功能会打印“2011年12月12日00:00:00 PST 2011”,并且不会抛出ParseException。
有谁能告诉我如何让SimpleDateFormat将“2011/12 / 12aaa”视为无效的日期字符串并抛出异常?
答案 0 :(得分:12)
parse(...)
上的JavaDoc声明如下:
解析不一定使用字符串末尾的所有字符
好像你不能让SimpleDateFormat
抛出异常,但你可以做到以下几点:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/d");
sdf.setLenient(false);
ParsePosition p = new ParsePosition( 0 );
String t1 = "2011/12/12aaa";
System.out.println(sdf.parse(t1,p));
if(p.getIndex() < t1.length()) {
throw new ParseException( t1, p.getIndex() );
}
基本上,您检查解析是否消耗了整个字符串,如果没有,则输入无效。
答案 1 :(得分:4)
查看日期是否有效 如果日期有效,则返回以下方法,否则返回false。
public boolean isValidDate(String date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/d");
Date testDate = null;
try {
testDate = sdf.parse(date);
}
catch (ParseException e) {
return false;
}
if (!sdf.format(testDate).equals(date)) {
return false;
}
return true;
}
查看以下课程,该课程可以检查日期是否有效
**示例**
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateValidCheck {
public static void main(String[] args) {
if(new DateValidCheck().isValidDate("2011/12/12aaa")){
System.out.println("...date is valid");
}else{
System.out.println("...date is invalid...");
}
}
public boolean isValidDate(String date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/d");
Date testDate = null;
try {
testDate = sdf.parse(date);
}
catch (ParseException e) {
return false;
}
if (!sdf.format(testDate).equals(date)) {
return false;
}
return true;
}
}
答案 2 :(得分:2)
成功解析后,整个模式字符串SimpleDateFormat
停止评估它被解析的数据。
答案 3 :(得分:2)
可以使用Java 8 LocalDate:
public static boolean isDate(String date) {
try {
LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy/MM/dd"));
return true;
} catch (DateTimeParseException e) {
return false;
}
}
如果输入参数为"2011/12/12aaaaaaaaa"
,则输出为false
;
如果输入参数为"2011/12/12"
,则输出为true
答案 4 :(得分:0)
您可以使用ParsePosition
课程或sdf.setLenient(false)
功能
文档: http://docs.oracle.com/javase/7/docs/api/java/text/ParsePosition.html http://docs.oracle.com/javase/7/docs/api/java/text/DateFormat.html#setLenient(boolean)
答案 5 :(得分:0)
查看方法文档:ParseException if the beginning of the specified string cannot be parsed
。
使用javadoc的方法源代码:
/**
* Parses text from the beginning of the given string to produce a date.
* The method may not use the entire text of the given string.
* <p>
* See the {@link #parse(String, ParsePosition)} method for more information
* on date parsing.
*
* @param source A <code>String</code> whose beginning should be parsed.
* @return A <code>Date</code> parsed from the string.
* @exception ParseException if the beginning of the specified string
* cannot be parsed.
*/
public Date parse(String source) throws ParseException
{
ParsePosition pos = new ParsePosition(0);
Date result = parse(source, pos);
if (pos.index == 0)
throw new ParseException("Unparseable date: \"" + source + "\"" ,
pos.errorIndex);
return result;
}
答案 6 :(得分:-1)
只需设置sdf.setLenient(false)
即可解决问题。