我有一个简单的问题:我想"yyyyMMdd"
严格解析Java字符串的格式,所以这"19800229"
是有效日期,但"19820229"
不是。假设这些是公历的公历。
我正在尝试使用java.time
JDK 8中的新软件包来解决此问题,但是事实证明,它比希望的要复杂。我当前的代码是:
private static final DateTimeFormatter FORMAT = DateTimeFormatter
.ofPattern("yyyyMMdd").withChronology(IsoChronology.INSTANCE)
.withResolverStyle(STRICT);
public static LocalDate parse(String yyyyMMdd) {
return LocalDate.parse(yyyyMMdd, FORMAT);
}
但是,解析一个有效的日期(例如“ 19800228”)对我来说是一个无法理解的错误:
java.time.format.DateTimeParseException:无法解析文本“ 19820228”:无法从TemporalAccessor获取LocalDate:{MonthOfYear = 2,DayOfMonth = 28,YearOfEra = 1982},类型为java.time.format.Parsed的ISO
如何使用它java.time.format.DateTimeFormatter
来解决我的简单用例?
我正在通过使用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);
}
}
1982年2月29日无效,将引发以下情况:
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个字符的子字符串来消除对解析器的需求。但是那是两件事。解析程序将在输入中标记无效的日期格式,并且子字符串当然会删除多余的字符。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句