Saya ingin mengurai string "OCTOBER81984" ke Java LocalDate. Saya menggunakan kode berikut tetapi tidak berhasil

LocalDate.parse("OCTOBER81984",
    new DateTimeFormatterBuilder() 
         .parseCaseInsensitive()
         .appendPattern("MMMMdyyyy")
         .toFormatter(Locale.US)
);

Pengecualiannya adalah

Exception in thread "main" java.time.format.DateTimeParseException: Text 'OCTOBER81984' could not be parsed at index 12
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    at java.time.LocalDate.parse(LocalDate.java:400)

Pola yang digunakan adalah

MMMM --> Full month name
d    --> Day of month with 1 or 2 digits
yyyy --> Year

Saya telah membaca dokumen dua kali dan pola saya terlihat baik-baik saja tetapi benar-benar tidak berfungsi.

Apa yang saya lewatkan?

0
aconsuegra 12 Mei 2021, 17:39

1 menjawab

Jawaban Terbaik

Masalahnya adalah Anda memiliki 2 bidang lebar variabel, hari dan tahun. Pengurai tidak cukup pintar untuk mengetahui bahwa string Anda tidak berarti 81 Oktober 984 (81-984 OKTOBER).

Itu adalah contoh di mana Anda akan berpikir mungkin cukup pintar untuk mengetahui bahwa 81 Oktober adalah omong kosong, tetapi misalkan masukan Anda adalah OKTOBER11984. Itu bisa dengan mudah menjadi 11 Oktober 984.

Jika Anda dapat menangani penambahan batasan yang mengatakan tahun harus 4 digit, pengurai kemudian dapat mentolerir fakta bahwa hari dalam bulan bukanlah lebar tetap.

Coba ini:

LocalDate.parse("OCTOBER81984", 
    new DateTimeFormatterBuilder()
        .parseCaseInsensitive()
        .appendPattern("MMMM") // or .appendText(ChronoField.MONTH_OF_YEAR)
        .appendValue(ChronoField.DAY_OF_MONTH, 1, 2, SignStyle.NEVER)
        .appendValue(ChronoField.YEAR_OF_ERA, 4)
        .toFormatter(Locale.US)
)
4
Michael 12 Mei 2021, 14:54