我正在编辑,通过使用由DateTimeFormatterBuilder创建的自定义格式化程序来限制哪种类型的字符串将被视为有效.
public class DateFormmaterTest {
static DateTimeFormatter CUSTOM_BASIC_ISO_DATE = new DateTimeFormatterBuilder()
.parseCaseInsensitive().appendValue(YEAR, 4)
.appendValue(MONTH_OF_YEAR, 2).appendValue(DAY_OF_MONTH, 2)
.optionalStart().toFormatter()
.withResolverStyle(ResolverStyle.STRICT)
.withChronology(IsoChronology.INSTANCE);
public static void main(String[] args) {
LocalDate date1 = LocalDate.parse("19800228-5000",
CUSTOM_BASIC_ISO_DATE);
System.out.println(date1);
}
}
2/29/1982是无效的,并将抛出以下内容:
Caused by: java.time.DateTimeException: Invalid date 'February 29' as '1982' is not a leap year
at java.time.LocalDate.create(LocalDate.java:429)
19800228-5000的日期将使用BASIC_ISO_DATE,因为它允许您不希望允许的可选偏移.我的CUSTOM_BASIC_ISO_DATE格式化程序将不允许并抛出以下内容:
Exception in thread "main" java.time.format.DateTimeParseException: Text '19800228-5000' could not be parsed, unparsed text found at index 8.
注意,如果您确定字符串长度,yyyyMMdd,那么您可以随时使用前8个字符的子字符串来否定解析器的需要.不过这是两件事情.解析器将在输入时标记无效的日期格式,子串当然只会剥离额外的字符.