LocalDateTime ayrıştırılırken TemporalAccessor'dan LocalDateTime alınamıyor (Java 8)


152

Sadece Java 8 DateTime nesnesine bir tarih dizesi dönüştürmek çalışıyorum. Aşağıdaki satırları çalıştırdıktan sonra:

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

Aşağıdaki hatayı alıyorum:

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)

Sözdizimi, burada önerilenle aynıdır , ancak bir istisna ile sunuluyorum. Kullanıyorum JDK-8u25.

Yanıtlar:


178

Java'nın DateTime olarak çıplak bir Date değerini kabul etmediği anlaşılıyor. LocalDateTime yerine LocalDate kullanmak sorunu çözer:

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

42
Ne olursa olsun için: Kullandığım Hatta bu aynı problem vardı LocalDateve değil LocalDateTime. Sorunum benim yaratmıştı olmasıydı DateTimeFormatterkullanarak .withResolverStyle(ResolverStyle.STRICT);, ben tarih desen kullanmak zorunda uuuuMMddyerine yyyyMMdd(yerine "yıl-of-the dönemin" yani "yılı")!
— ZeroOne

72

Bir tarihi bir LocalDateTime nesnesine dönüştürmeniz gerekiyorsa, LocalDate.atStartOfDay () öğesini kullanabilirsiniz. Bu, saat, dakika ve saniye alanlarının 0 olarak ayarlanmasıyla belirtilen tarihte bir LocalDateTime nesnesi verecektir:

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

2
Düzeltme: o günün başlangıcında ne zaman olursa olsun ayarlanır .
— Trejkaz

20
LocalDateTime.fromatStartOfDay()zaten döndüğü gibi gereksiz görünüyor LocalDateTime.
— Dariusz

1
scala: val time = LocalDate.parse ("20171220", DateTimeFormatter.ofPattern ("yyyyMMdd")). atStartOfDay.format (DateTimeFormatter.ofPattern ("yyyy-AA-gg SS: dd: ss"))
— Woody Sun

48

Birinin bu konuyu (benim gibi) tekrar okuması gerekiyorsa, doğru cevap DateTimeFormattertanımda olacaktır, örneğin:

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(); 

Eğer görüneceklerse isteğe bağlı alanlar ayarlanmalıdır. Ve kodun geri kalanı tamamen aynı olmalıdır.


1
Bu, örneğin bu yöntem için gerçek bir evrensel çözümdür: Long getFileTimestamp (Dize dosyası, Desen deseni, DateTimeFormatter dtf, int group); Burada farklı desenler ve DateTimeFormetter, w / ve w / o zaman belirtilmiş.
— toootooo

Statik bir alan olabilir mi? Javadoc'ta bu şekilde oluşturulan bir örneğin iş parçacığı açısından güvenli olduğunu bulamadım
— Kamil Roman

parseDefaultingAradığınız AFTER'i eklemeyi unutmayın appendPattern. Aksi halde verir DateTimeParseException.
— wittyameta

31

Bu gerçekten belirsiz ve yararsız bir hata mesajıdır. Çok deneme yanılma sonra LocalDateTimebir zaman ayrıştırma girişiminde bulunmazsanız yukarıdaki hata verecektir bulundu . Bunun LocalDateyerine, hatasız çalışır.

Bu zayıf bir şekilde belgelenmiştir ve ilgili istisna çok yararsızdır.


25

Üzerine Genişleyen retrography cevabı ..: Ben kullanarak bile bu aynı problem vardı LocalDateve değil LocalDateTime. Sorunum benim yaratmıştı olmasıydı DateTimeFormatterkullanarak .withResolverStyle(ResolverStyle.STRICT);, ben tarih desen kullanmak zorunda uuuuMMddyerine yyyyMMdd(yerine "yıl-of-the dönemin" yani "yılı")!

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

(Bu çözüm aslında retrografinin cevabının bir yorumuydu, ancak tek başına bir cevap olarak göndermem teşvik edildi çünkü görünüşte birçok insan için gerçekten iyi çalışıyor.)


1
Neden "y" yerine "u" yanıtı bu bağlantıda cevaplanmıştır uuuu-versus-yyyy-in-datetimeformatter-biçimlendirme-model-in-java @Peru
— prashanth

23

Bu hatayla buraya inen herkes için, yaptığım gibi:

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

Aşağıdaki satırdan geldi:

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

Bunun nedeni, 24 saat modeli yerine 0 saatte 12 saatlik bir desen kullandığımdı.

Büyük bir H kullanarak saati 24 saate dönüştürmek sorunu giderir:

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

12

Tarih Dizesi saat, dakika vb. İçin herhangi bir değer içermiyorsa, bunu doğrudan a'ya dönüştüremezsiniz LocalDateTime. Bunu yalnızca a'ya dönüştürebilirsiniz LocalDate, çünkü dize yalnızca yıl, ay ve tarih bileşenlerini temsil eder , yapılacak doğru şeydir.

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

Her neyse, bunu dönüştürebilirsiniz 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

Ayrıca formatın doğru olduğundan emin olun. Bu düzeltme, formatı yyyy-mm-ddolması gereken zamana ayarladığım için benim için çalışmadı yyyy-MM-dd.
— patstuart

0

Bunu dene:

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

İstediğiniz biçimi ekleyebilirsiniz. Bu benim için işe yarıyor!


0

Bu iyi çalışıyor

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);
    }
}

çıktı:

VALUE=2018-08-16
VALUE1=2018-08-16T12:10
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.