Tôi gặp vấn đề đơn giản: Tôi muốn phân tích cú pháp các chuỗi Java theo định dạng "yyyyMMdd"
nghiêm ngặt, sao cho "19800229"
là ngày hợp lệ, nhưng "19820229"
thì không. Giả sử đây là những ngày AD từ lịch Gregorian bình thường.Sử dụng Java 8 DateTimeFormatter mới để phân tích cú pháp ngày tháng
Tôi đang cố gắng sử dụng gói java.time
mới từ JDK 8 để giải quyết vấn đề này, nhưng điều này chứng tỏ phức tạp hơn mong đợi. mã hiện tại của tôi là:
private static final DateTimeFormatter FORMAT = DateTimeFormatter
.ofPattern("yyyyMMdd").withChronology(IsoChronology.INSTANCE)
.withResolverStyle(STRICT);
public static LocalDate parse(String yyyyMMdd) {
return LocalDate.parse(yyyyMMdd, FORMAT);
}
Tuy nhiên, phân tích một ngày hợp lệ như "19.800.228" sản xuất những gì để cho tôi một lỗi không thể hiểu được là:
java.time.format.DateTimeParseException: Text '19820228' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {MonthOfYear=2, DayOfMonth=28, YearOfEra=1982},ISO of type java.time.format.Parsed
Làm thế nào để sử dụng java.time.format.DateTimeFormatter
để giải quyết trường hợp sử dụng đơn giản của tôi ?
Cảm ơn @Tech Trip. Xin lỗi tôi có nghĩa là 2/29 trong cả hai trường hợp, như bạn đã chỉ ra. Lý do tôi tránh 'DateTimeFormatter.BASIC_ISO_DATE' là nó có phần tùy chọn mà tôi không muốn phân tích cú pháp. Tôi có thể tạo một trình định dạng tương đương không có phần tùy chọn không? – 0xbe5077ed
Tôi đã sửa đổi câu trả lời để xem xét nhận xét cuối cùng của bạn. Xin vui lòng cho nó một cái nhìn! – TechTrip
Đủ tốt, @Tech Trip. Đó là những gì tôi phát hiện ra là tốt. Lưu ý rằng bạn có thể loại bỏ 'parseCaseInsensitive()' - không cần thiết vì yyyyMMdd không có vấn đề về trường hợp - và 'startOptional()' vì bạn không bắt đầu bất cứ điều gì tùy chọn. – 0xbe5077ed