2015-07-24 27 views
18

Benim girdim 1 Temmuz 2015 için "01-07-2015" biçimindeki bir tarihin dize olarak temsilidir. Bu, bir java.time.LocalDate değişkenine ayrıştırmaya çalışıyorum : Dize LocalDate (Java 8) ayrıştırılamıyor

final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("dd-MM-YYYY"); 
final String input = "01-07-2015"; 
final LocalDate localDate = LocalDate.parse(input, DATE_FORMAT); 

DateTimeFormatter JavaDoc dayanarak, bu işe beklenebilir.

Neden Olduğu: java.time.DateTimeException: Ancak, ben bir çok dost ve yardımcı mesajla karşılaşacaksınız ediyorum {DayOfMonth = 1, MonthOfYear = 7, WeekBasedYear [WeekFields [PAZARTESİ: TemporalAccessor dan LOCALDATE alınamıyor , 4]] = 2015}, ISO türü java.time.format.Parsed

Bu özel durumun bana ne anlattığını gerçekten anlamıyorum. Herkes bana neyin yanlış gittiğini açıklayabilir mi?

final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("dd-MM-yyyy"); 

Büyük Y harfi weekyear için kullanılır: yıl için

+9

"YYYY" yerine "yyyy" yi seçmelisiniz – adatapost

cevap

25

Eğer küçük y kullanmak zorunda. Daha fazla bilgi için javadoc of DateTimeFormatter'a bakın.

+3

Sadece meraktan dolayı, hata iletisi 'Y', _year_? – mthmulders

+4

Hata mesajı {DayOfMonth = 1, MonthOfYear = 7, WeekBasedYear [WeekFields [MONDAY, 4]] = 2015} yazıyor, bu, giriş dizenizden 1'i DayOfMonth (deseninizde "d" kullandığınız için) olarak ayrıştırıldığı anlamına gelir, 7 deseninizdeki "M" nedeniyle MonthOfYear olarak ayrıştırıldı ve 2015, deseninizdeki "Y" WeekBasedYear (haftaya göre) becaues olarak anlaşıldı. – Kejml

+0

@mthmulders Bazen [istisna mesajları emmek] (http: //programmers.stackexchange .com/sorular/278949/neden-do-pek-istisna-mesajları-not-ihtiva-kullanışlı-details). Verilmiş, bu istisna gerçekten de o kadar da kötü değildir ve size “YYYY” yi ayrıştırmaya çalıştığı şeyi anlatır. [Java datetimeformatter weekbasedyear] 'ı (https://www.google.com/search?q=java+datetimeformatter+weekbasedyear) araştırdım ve ilk sonuç beni buraya getirdi (https://docs.oracle.com/javase /8/docs/api/java/time/format/DateTimeFormatter.html), tanımlayıcı türlerini ve ne anlama geldiğini listeler. –

12

Sorunun cevabı 'y' değil 'Y' kullanmaktır. hata mesajını açıklamak için

, bunu ayrıştırmak sağlar:

Unable to obtain LocalDate from TemporalAccessor

Bu yaratamaz söyleyerek bir hashmap- sağlayan TemporalAccessor (düşük seviyeli arayüzünden LocalDate (istenenle) Tarih/zaman alanlarına erişim gibi).

of type java.time.format.Parsed

Bu yönteme geçirilen nesne türü java.time.format.Parsed arasında olduğu söylüyor. Bu, standart çıktı türü ayrıştırma türüdür ve ayrıştırılan tüm bilgileri içerir.

{DayOfMonth=1, MonthOfYear=7, WeekBasedYear[WeekFields[MONDAY,4]]=2015},ISO

Bu ayrıştırma sonucu java.time.format.Parsed nesnenin toString() şeklidir. Dört şey ayrıştırıldı söylüyor:

  • DayOfMonth=1, günündeki ay 1
  • MonthOfYear=7 değeriyle ayrıştırıldı, ay-of-the yılı 7
  • WeekBasedYear[WeekFields[MONDAY,4]]=2015 değeriyle çözümlenir, hafta bazlı yıllık ISO takvim sistemi olduğunu 2015
  • ISO değeri, (varsayılan değer)
ile çözümlenen

DayOfMonth + MonthOfYear + WeekBasedYear kombinasyonundan LocalDate üretmek mümkün olmadığından, bir istisna atılır.

[WeekFields[MONDAY,4]] bölümünün, bir hafta tanımlamanın, ABD haftalarında Pazar günü başlayan, ancak ISO standardında ve AB'de Pazartesi günü başlayacakları birçok farklı yol olduğuna dikkat edin.