Pertanyaan Tidak dapat memperoleh LocalDateTime dari TemporalAccessor saat menguraikan LocalDateTime (Java 8)


Saya hanya mencoba mengubah string tanggal menjadi objek DateTime di Java 8. Setelah menjalankan baris berikut:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime dt = LocalDateTime.parse("20140218", formatter);

Saya mendapatkan kesalahan berikut:

Exception in thread "main" java.time.format.DateTimeParseException: 
Text '20140218' could not be parsed: 
Unable to obtain LocalDateTime from TemporalAccessor: 
{},ISO resolved to 2014-02-18 of type java.time.format.Parsed
    at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1918)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1853)
    at java.time.LocalDateTime.parse(LocalDateTime.java:492)

Sintaksnya identik dengan apa yang telah disarankan sini, namun saya disajikan dengan pengecualian. saya menggunakan JDK-8u25.


75
2017-12-13 00:04


asal


Jawaban:


Ternyata Java tidak menerima nilai Tanggal kosong sebagai DateTime. Menggunakan LocalDate bukannya LocalDateTime memecahkan masalah:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate dt = LocalDate.parse("20140218", formatter);

98
2017-12-13 00:20



Jika Anda benar-benar perlu mengubah tanggal ke objek LocalDateTime, Anda bisa menggunakan LocalDate.atStartOfDay (). Ini akan memberi Anda objek LocalDateTime pada tanggal yang ditentukan, setelah bidang jam, menit dan detik diatur ke 0:

final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime time = LocalDate.parse("20140218", formatter).atStartOfDay();

37
2017-10-01 11:33



Ini adalah pesan galat yang benar-benar tidak jelas dan tidak membantu. Setelah banyak trial and error saya menemukan itu LocalDateTime akan memberikan kesalahan di atas jika Anda tidak mencoba mengurai waktu. Dengan menggunakan LocalDate sebaliknya, ia bekerja tanpa kesalahan.

Ini tidak terdokumentasi dengan baik dan pengecualian terkait sangat tidak membantu.


24
2018-01-26 23:33



Untuk apa yang berharga jika ada yang harus membaca lagi topik ini (seperti saya) jawaban yang benar akan masuk DateTimeFormatter definisi, misalnya:

private static DateTimeFormatter DATE_FORMAT =  
            new DateTimeFormatterBuilder().appendPattern("dd/MM/yyyy[ [HH][:mm][:ss][.SSS]]")
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
            .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
            .toFormatter(); 

Satu harus mengatur bidang opsional jika mereka akan muncul. Dan sisa kode harus persis sama.


21
2017-09-25 09:11



Memperluas Jawaban retrography..: Saya memiliki masalah yang sama ini bahkan ketika menggunakan LocalDate dan tidak LocalDateTime. Masalahnya adalah saya telah membuat saya DateTimeFormatter menggunakan .withResolverStyle(ResolverStyle.STRICT);, jadi saya harus menggunakan pola tanggal uuuuMMdd dari pada yyyyMMdd (mis. "tahun" bukan "tahun-era")!

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
  .parseStrict()
  .appendPattern("uuuuMMdd")
  .toFormatter()
  .withResolverStyle(ResolverStyle.STRICT);
LocalDate dt = LocalDate.parse("20140218", formatter);

(Solusi ini awalnya adalah komentar untuk jawaban retrography, tetapi saya didorong untuk mempostingnya sebagai jawaban yang berdiri sendiri karena tampaknya bekerja sangat baik bagi banyak orang.)


13
2018-04-28 08:10



Jika tanggal String tidak menyertakan nilai apa pun selama berjam-jam, menit, dan lain-lain, Anda tidak dapat secara langsung mengonversinya menjadi a LocalDateTime. Anda hanya dapat mengonversinya menjadi a LocalDate, karena string hanya  mewakili itu tahun, bulan dan tanggal komponen itu akan menjadi hal yang benar untuk dilakukan.

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf); // 2018-03-06

Pokoknya Anda bisa mengubahnya menjadi LocalDateTime.

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf);
LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(0,0)); // 2018-03-06T00:00

5
2018-03-12 09:38



Bagi siapa saja yang mendarat di sini dengan kesalahan ini, seperti yang saya lakukan:

Unable to obtain LocalDateTime from TemporalAccessor: {HourOfAmPm=0, MinuteOfHour=0}

Itu berasal dari baris berikut:

LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy h:mm"));

Ternyata itu karena saya menggunakan pola Jam 12 jam pada jam 0, bukan pola 24 jam.

Mengubah pola jam menjadi 24 jam dengan menggunakan huruf kapital H akan memperbaikinya:

LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy H:mm"));

2
2018-05-17 19:18