Java DateTimeFormatter tidak mengurai seperti yang diharapkan [duplikat]

Sep 02 2020

Saya mencoba DateTimeFormatter untuk mengurai tanggal masukan dd/MM/yyyy. Saya telah menggunakan kode di bawah ini

java.time.format.DateTimeFormatter gagal mengurai tanggal

  DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy").withResolverStyle(ResolverStyle.STRICT);
    
       
            try {
                LocalDate.parse(dateField, dateFormatter);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        
        return true;
    }

Memasukkan: 30/04/2018

Error:Caused by: java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {MonthOfYear=4, YearOfEra=2018, DayOfMonth=30},ISO of type java.time.format.Parsed

Itu juga gagal selama tahun kabisat.

Jawaban

1 deHaar Sep 02 2020 at 13:47

Pada dasarnya Anda memiliki dua opsi (di sini, di mana salah satunya menggunakan yang ResolverStyleAnda tunjukkan dalam contoh kode Anda):

  • gunakan hanya tahunResolverStyle.STRICT parsing secara eksplisit u
  • gunakan default ResolverStyle⇒ year-of-era y atau tahun u akan diurai

Contoh berikut menunjukkan perbedaan kode:

public static void main(String[] args) {
    String date = "30/04/2018";
    // first formatter with year-of-era but no resolver style
    DateTimeFormatter dtfY = DateTimeFormatter.ofPattern("dd/MM/yyyy");
    // second one with year and a strict resolver style
    DateTimeFormatter dtfU = DateTimeFormatter.ofPattern("dd/MM/uuuu")
                                                .withResolverStyle(ResolverStyle.STRICT);
    // parse
    LocalDate localDateU = LocalDate.parse(date, dtfU);
    LocalDate localDateY = LocalDate.parse(date, dtfY);
    // print results
    System.out.println(localDateU);
    System.out.println(localDateY);
}

Outputnya adalah

2018-04-30
2018-04-30

jadi keduanya DateTimeFormattermengurai sama String, tetapi yang tanpa ResolverStylelampiran eksplisit akan digunakan ResolverStyle.SMARTsecara default sesuai dengan JavaDocs dariDateTimeFormatter .

Tentu saja, pola dengan tahun ( u) akan diurai ResolverStyle.SMARTjuga, jadi

DateTimeFormatter.ofPattern("dd/MM/uuuu");

akan menjadi pilihan juga.

Penjelasan yang bagus tentang perbedaan antara tahun-era dan tahun dapat ditemukan di posting ini .

3 layonez Sep 02 2020 at 13:43

Masalahnya adalah menggunakan .withResolverStyle(ResolverStyle.STRICT)wajib menggunakan pola tahun uuuu bukan yyyy (yaitu "tahun" bukan "tahun era")