Java DateTimeFormatter tidak mengurai seperti yang diharapkan [duplikat]
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
Pada dasarnya Anda memiliki dua opsi (di sini, di mana salah satunya menggunakan yang ResolverStyleAnda tunjukkan dalam contoh kode Anda):
- gunakan hanya tahun
ResolverStyle.STRICTparsing secara eksplisitu - gunakan default
ResolverStyle⇒ year-of-erayatau tahunuakan 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 .
Masalahnya adalah menggunakan .withResolverStyle(ResolverStyle.STRICT)wajib menggunakan pola tahun uuuu bukan yyyy (yaitu "tahun" bukan "tahun era")