Tidak dapat memperoleh LocalDateTime dari TemporalAccessor saat mem-parsing LocalDateTime (Java 8)

151

Saya hanya mencoba untuk 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 di sini , namun saya dilayani dengan pengecualian. Saya menggunakan JDK-8u25.

retrography
sumber

Jawaban:

177

Ternyata Java tidak menerima nilai Tanggal telanjang sebagai DateTime. Menggunakan LocalDate alih-alih LocalDateTime memecahkan masalah:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate dt = LocalDate.parse("20140218", formatter);
retrography
sumber
42
Untuk apa nilainya: Saya punya masalah yang sama bahkan ketika menggunakan LocalDatedan tidak LocalDateTime. Masalahnya adalah bahwa saya telah membuat DateTimeFormatterpenggunaan saya .withResolverStyle(ResolverStyle.STRICT);, jadi saya harus menggunakan pola tanggal uuuuMMddalih-alih yyyyMMdd(yaitu "tahun" bukannya "tahun-zaman")!
ZeroOne
72

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

final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime time = LocalDate.parse("20140218", formatter).atStartOfDay();
Øyvind Mo
sumber
2
Koreksi: atur kapan saja di awal hari itu .
Trejkaz
20
LocalDateTime.fromtampaknya tidak perlu, karena atStartOfDay()sudah kembali LocalDateTime.
Dariusz
1
scala: val time = LocalDate.parse ("20171220", DateTimeFormatter.ofPattern ("yyyyMMdd")). atStartOfDay.format (DateTimeFormatter.ofPattern ("yyyy-MM-dd HH: mm: ss")
Woody Sun
48

Untuk apa nilainya jika ada orang yang membaca lagi topik ini (seperti saya), jawaban yang benar akan ada dalam DateTimeFormatterdefinisi, 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(); 

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

Iulian David
sumber
1
Ini adalah solusi universal yang benar misalnya untuk metode tersebut: Long getFileTimestamp (file String, pola Pola, DateTimeFormatter dtf, grup int); Di sini Anda memiliki pola dan DateTimeFormetter yang berbeda, w / dan w / o waktu yang ditentukan.
toootooo
Bisakah ini menjadi bidang statis? Saya belum menemukan di Javadoc bahwa sebuah instance yang dibuat dengan cara itu adalah thread-safe
Kamil Roman
Ingatlah untuk menambahkan parseDefaultingSETELAH yang Anda panggil appendPattern. Kalau tidak, itu akan memberi DateTimeParseException.
wittyameta
31

Ini adalah pesan kesalahan yang benar-benar tidak jelas dan tidak membantu. Setelah banyak trial and error saya menemukan bahwa LocalDateTimeakan memberikan kesalahan di atas jika Anda tidak mencoba untuk menguraikan waktu. Dengan menggunakan LocalDatesebagai gantinya, ia bekerja tanpa kesalahan.

Ini didokumentasikan dengan buruk dan pengecualian terkait sangat tidak membantu.

Tom B
sumber
25

Memperluas jawaban retrography ..: Saya punya masalah yang sama bahkan ketika menggunakan LocalDatedan tidak LocalDateTime. Masalahnya adalah bahwa saya telah membuat DateTimeFormatterpenggunaan saya .withResolverStyle(ResolverStyle.STRICT);, jadi saya harus menggunakan pola tanggal uuuuMMddalih-alih yyyyMMdd(yaitu "tahun" bukannya "tahun-zaman")!

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 dengan sangat baik bagi banyak orang.)

Kosong satu
sumber
1
Jawaban mengapa "u" bukan "y" telah dijawab dalam tautan ini uuuu-versus-yyyy-in-datetimeformatter-format-kode-kode-dalam-java @Peru
prashanth
23

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 modal H memperbaikinya:

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

Jika tanggal String tidak termasuk nilai untuk jam, menit dan dll Anda tidak bisa langsung mengubahnya ke LocalDateTime. Anda hanya dapat mengubahnya menjadi LocalDate, karena string hanya mewakili satu 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

Bagaimanapun Anda dapat mengonversikan ini 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
utama
sumber
Pastikan juga formatnya benar. Perbaikan ini tidak berfungsi untuk saya sampai karena saya mengatur format yyyy-mm-ddkapan seharusnya yyyy-MM-dd.
patstuart
0

Coba yang ini:

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MM-dd-yyyy"); 
LocalDate fromLocalDate = LocalDate.parse(fromdstrong textate, dateTimeFormatter);

Anda dapat menambahkan format apa pun yang Anda inginkan. Itu berhasil untuk saya!

Vinay Kasarla
sumber
0

Ini berfungsi dengan baik

public class DateDemo {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm");
        String date = "16-08-2018 12:10";
        LocalDate localDate = LocalDate.parse(date, formatter);
        System.out.println("VALUE="+localDate);

        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
        LocalDateTime parse = LocalDateTime.parse(date, formatter1);
        System.out.println("VALUE1="+parse);
    }
}

keluaran:

VALUE=2018-08-16
VALUE1=2018-08-16T12:10
Jeff Cook
sumber