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.