使用严格格式将字符串转换为Date

时间:2015-10-06 14:21:55

标签: java date

我需要将字符串转换为具有确切格式的日期(dd / MM / yyyy) 我写了这个方法:

public static Date toDate(String input, String format) throws DateConverterException {
        if (StringUtils.isEmpty(input) || StringUtils.isEmpty(format)) {
            throw new DateConverterException (String.format("Input %s or format %s is empty or", input, format));
        }
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        sdf.setLenient(false);
        Date date = null;
        try {
            date = sdf.parse(input);
        } catch (ParseException e) {
            throw new DateConverterException (e);
        }
        return date;
    }

因此,如果输入日期为" 06/10 /" ,抛出异常=好 但如果输入日期为" 06/10/1"尽管格式不受尊重,但构建日期

任何帮助将不胜感激 非常感谢你

1 个答案:

答案 0 :(得分:3)

  

是的,我很抱歉,我把0作为一个例子,但确实抛出异常。现在在06/10/1或06/10/2,它将构建日期。

来自the documentation

  

年度:如果格式化程序的日历是阳历,则会应用以下规则。

     

...

     
      
  • 对于解析,如果模式字母的数量大于2,则按字面解释年份,无论数字位数。所以使用模式" MM / dd / yyyy"," 01/11/12"解析到1月11日,12 A.D。

  •   
  • 对于使用缩写年份模式进行解析(" y"或" yy"),SimpleDateFormat必须解释相对于某个世纪的缩写年份。它通过将日期调整为创建SimpleDateFormat实例之前的80年和20年之后来实现此目的。例如,使用" MM / dd / yy"和1997年1月1日创建的SimpleDateFormat实例,字符串" 01/11/12"将被解释为2012年1月11日,而字符串" 05/04/64"将被解释为1964年5月4日。在解析期间,只有由Character.isDigit(char)定义的由两位数组成的字符串才会被解析为默认世纪。任何其他数字字符串,例如一位数字符串,三位或更多位数字符串,或者不是所有数字的两位数字符串(例如," -1和#34;),按字面解释。所以" 01/02/3"或" 01/02 / 003"使用相同的模式解析,如公元1月2日。同样," 01/02 / -3"解析为公元前1月2日。

  •   

(我的重点)

例如,1是有效年份。如果您只想接受一定范围内的年份(例如1800-2100),则需要在解析后的日期检查年份。