我想以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;
}
答案 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)