Soru LocalDateTime (Java 8) ayrıştırılırken TemporalAccessor'dan LocalDateTime elde edilemiyor


Ben sadece bir tarih dizesi Java 8'de bir DateTime nesnesine dönüştürmeye çalışıyorum. Şu 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 önerilenin aynısıdır. İştehenüz bir istisna ile hizmet ediyorum. Ben kullanıyorum JDK-8u25.


76
2017-12-13 00:04


Menşei


Lütfen @ZeroOne cevabına bir göz atın stackoverflow.com/a/43675230/4914577  Ayrıca, LocalDate'i arıyorsanız. - Peru


Cevaplar:


Bu, Java'nın DateTime gibi çıplak bir Tarih değerini kabul etmediği ortaya çıkıyor. LocalDateTime yerine LocalDate kullanmak sorunu çözer:

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

99
2017-12-13 00:20



Değer ne için: Ben kullanırken bile aynı sorun vardı LocalDate ve yok LocalDateTime. Mesele benim yarattığım DateTimeFormatter kullanma .withResolverStyle(ResolverStyle.STRICT);, bu yüzden tarihi kalıbı kullanmak zorundaydım uuuuMMdd yerine yyyyMMdd (yani "yıl dönümü" yerine "yıl")! - ZeroOne
@ZeroOne Teşekkür ederiz 'uuuu' katı modda çalışıyorsa bu sorunun tam cevabı - Justin Ohms
@ZeroOne bu sıkı bir çözümleyici ile doğru cevaptır. Çok teşekkür ederim! - laughing_man
@ZeroOne Bence bunu tek başına bir cevap olarak göndermelisiniz. Diğer herhangi bir cevaptan çok daha iyidir ve soruya yorum yapmaktan daha kolay olur. - charlie_pl
@charlie_pl Tamam, fikir için teşekkürler, ve işte gidiyorsun: stackoverflow.com/a/43675230/1333157 ! :) - ZeroOne


Bir tarihi bir LocalDateTime nesnesine dönüştürmeniz gerekiyorsa, LocalDate.atStartOfDay () yöntemini kullanabilirsiniz. Bu, belirtilen tarihte bir LocalDateTime nesnesi verir, saat, dakika ve saniye alanları 0'a ayarlanır:

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

37
2017-10-01 11:33



Düzeltme: ayarlandı o günün başında ne olursa olsun. - Trejkaz
LocalDateTime.from gereksiz gibi görünüyor atStartOfDay() zaten geri döndü LocalDateTime. - Dariusz
scala: val time = LocalDate.parse ("20171220", DateTimeFormatter.ofPattern ("yyyyMMdd")). atStartOfDay.format (DateTimeFormatter.ofPattern ("yyyy-AA-gg HH: dd: ss")) - Woody Sun


Bu gerçekten belirsiz ve yardımcı olmayan bir hata iletisidir. Çok fazla deneme ve hatadan sonra bunu buldum LocalDateTime Bir zamanı ayrıştırmaya kalkışmazsanız yukarıdaki hatayı verir. Kullanarak LocalDate bunun yerine, hatasız çalışır.

Bu kötü belgelenmiştir ve ilgili istisna çok yararsızdır.


26
2018-01-26 23:33





Kimsenin bu konuyu tekrar okuması gerekiyorsa (benim gibi) doğru cevabı DateTimeFormatter tanımı, ör .:

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

Görüleceklerse isteğe bağlı alanları ayarlamalıdır. Ve kodun geri kalanı tamamen aynı olmalıdır.


22
2017-09-25 09:11



Örneğin, bu yöntem için gerçek evrensel çözüm: Long getFileTimestamp (String dosyası, Pattern pattern, DateTimeFormatter dtf, int grup); Burada farklı desenler ve DateTimeFormetter var, w / ve belirtilen süre. - toootooo
Statik bir alan olabilir mi? Javadoc'ta bu şekilde yaratılmış bir örneğin iplik güvenli olduğunu bulamadım - Kamil Roman


Genişleyen retrografın cevabı..: Kullanırken bile aynı sorun vardı LocalDate ve yok LocalDateTime. Mesele benim yarattığım DateTimeFormatter kullanma .withResolverStyle(ResolverStyle.STRICT);, bu yüzden tarihi kalıbı kullanmak zorundaydım uuuuMMdd yerine yyyyMMdd (yani "yıl dönümü" yerine "yıl")!

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

(Bu çözüm aslen retrografinin cevabına bir yorumdu, ancak tek başına bir cevap olarak yayınlamaya teşvik edildim çünkü görünüşe göre birçok insan için gerçekten iyi çalışıyor.)


14
2018-04-28 08:10



Cevabınız için teşekkürler @ZeroOne. Geliştiricilerin ofjava.time.DateTimeFormatterBuilder neden "yyyy" yerine "uuuu" olmasını tercih ettiğinden emin değil - Peru


Tarih Dizgesi saat, dakika ve vb. İçin herhangi bir değer içermiyorsa, bunu doğrudan LocalDateTime. Bunu yalnızca bir LocalDateçünkü dize bir tek  temsil etmek  yıl, ay ve tarih bileşenleri yapmak doğru olan şey olurdu.

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

Neyse bunu 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





Bu hatayı buraya getiren herkese, 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 saatlik bir model yerine, 0 saatte 12 saatlik bir Saat deseni kullandığım olduğu ortaya çıktı.

Bir sermaye H kullanarak saatin 24 saate göre değiştirilmesi bunu düzeltir:

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

4
2018-05-17 19:18



Bu cevap günümü kurtardı - pedram bashiri