java 当str = 2011/12/12 aaaaaaaaaa?时,简单日期格式解析(字符串str)未抛出异常,

bfrts1fy  于 2023-02-18  发布在  Java
关注(0)|答案(7)|浏览(116)

下面是一个例子:

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不是有效的日期字符串。但是函数打印"Mon Dec 12 00:00:00 PST 2011"并且没有抛出ParseException。
有人能告诉我如何让SimpleDateFormat将"2011/12/12aaa"视为无效的日期字符串并抛出异常吗?

8ljdwjyq

8ljdwjyq1#

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() );
}

基本上,检查解析是否消耗了整个字符串,如果没有,则输入无效。

g0czyy6m

g0czyy6m2#

检查日期是否有效以下方法返回日期是否有效,否则返回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;

    }

}
db2dz4w8

db2dz4w83#

Java 8本地日期可用于:

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

1hdlvixo

1hdlvixo4#

在成功解析整个模式字符串SimpleDateFormat之后,它将停止评估要解析的数据。

628mspwn

628mspwn5#

请看方法文档,其中写道: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;
}
hrirmatl

hrirmatl6#

可以使用ParsePosition类或sdf.setLenient(false)函数
文档:设置宽限期(布尔值)

nfzehxib

nfzehxib7#

只需设置sdf.setLenient(false)即可。

相关问题