SimpleDateFormat parse(string str) doesn't throw an exception when str = 2011/12/12aaaaaaaaa?

前端 未结 7 1804
野的像风
野的像风 2020-11-27 08:06

Here is an example:

public MyDate() throws ParseException {
    SimpleDateFormat sdf = new SimpleDateFormat(\"yyyy/MM/d\");
    sdf.setLenient(false);
    St         


        
相关标签:
7条回答
  • 2020-11-27 08:20

    You can use the ParsePosition class or the sdf.setLenient(false) function

    Docs: 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)

    0 讨论(0)
  • 2020-11-27 08:26

    To chack whether a date is valid The following method returns if the date is in valid otherwise it will return 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;
    
        }
    

    Have a look on the following class which can check whether the date is valid or not

    ** Sample Example**

    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;
    
        }
    
    }
    
    0 讨论(0)
  • 2020-11-27 08:27

    Simply setting sdf.setLenient(false) will do the trick..

    0 讨论(0)
  • 2020-11-27 08:28

    The JavaDoc on parse(...) states the following:

    parsing does not necessarily use all characters up to the end of the string

    It seems like you can't make SimpleDateFormat throw an exception, but you can do the following:

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

    Basically, you check whether the parse consumed the entire string and if not you have invalid input.

    0 讨论(0)
  • 2020-11-27 08:35

    After it successfully parsed the entire pattern string SimpleDateFormat stops evaluating the data it was given to parse.

    0 讨论(0)
  • 2020-11-27 08:38

    Take a look on the method documentation which says: ParseException if the beginning of the specified string cannot be parsed.

    Method source code with 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;
    }
    
    0 讨论(0)
提交回复
热议问题