日期格式验证不适用于yyyy-MM-dd

时间:2016-01-15 12:12:32

标签: java date simpledateformat

我想以yyyy-MM-dd格式验证日期。 如果我给出年份的两位数(即YY而不是YYYY),则不会抛出任何异常,并且在解析日期时会将00附加到日期时间格式。

我添加了setLenient(false);,但仍未正确验证。

有人可以帮我吗?

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
formatter.setLenient(false);
try {
   Date date = (Date)formatter.parse("15-05-30"); //In this line year is getting appened with 00 and becomes 0015
   reciptDate = dateFormat.format(date);
} catch (ParseException pe) {
   return false;
}

2 个答案:

答案 0 :(得分:2)

API docs for SimpleDateFormat指定

  

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

因此,您无法按原样使用SimpleDateFormat来执行您想要的验证(请注意,1年,2年或3位数年份是有效年份,因此> 4位数年份,但我认为这超出了问题的范围。)

使用正则表达式来验证您具有正好4位数的年份应该是微不足道的。

例如:

Pattern pattern = Pattern.compile("[0-9]{4}-[0-9]{2}-[0-9]{2}");

System.out.println("15-05-30: " + pattern.matcher("15-05-30").matches());
System.out.println("2015-05-30: " + pattern.matcher("2015-05-30").matches());
System.out.println("0015-05-30: " + pattern.matcher("0015-05-30").matches());

输出:

15-05-30: false
2015-05-30: true
0015-05-30: true

答案 1 :(得分:2)

如果您正在使用Java-8,则可以指定 最小年度组成部分。

DateTimeFormatter fmt = new DateTimeFormatterBuilder()
    .appendValue(ChronoField.YEAR, 4, 4, SignStyle.NEVER)
    .appendPattern("-MM-dd")
    .toFormatter();
LocalDate date = LocalDate.parse("15-05-30", fmt);

错误消息是:

  

线程“main”中的异常java.time.format.DateTimeParseException:

     

无法在索引0处解析文本'15 -05-30'

     

at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)

     

at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)

     

在java.time.LocalDate.parse(LocalDate.java:400)