2015-04-07 30 views
8

istenen kullanmadığından, AçıkçasıAyrıştırma dizesi bu DateTimeFormatter kullanıyorum yüzyıl

Unable to obtain LocalDate from TemporalAccessor: {DayOfMonth=15, MonthOfYear=7, WeekBasedYear[WeekFields[MONDAY,4]]=2090},ISO of type java.time.format.Parsed 

Ben TemporalAccessor aşağıdaki almak istiyorum:

{DayOfMonth=15, MonthOfYear=7, WeekBasedYear=1990} 

Ben yıl 209 var neden biliyor musunuz 1990 yerine 0? relevant section aşağıdaki Ben alıntılayacağım

bu soru yeni java.time -package gerçekten olduğundan Yardımlarınız

cevap

12

için teşekkürler ve NOT SimpleDateFormat:

Year: The count of letters determines the minimum field width below which padding is used. If the count of letters is two, then a reduced two digit form is used. For printing, this outputs the rightmost two digits. For parsing, this will parse using the base value of 2000, resulting in a year within the range 2000 to 2099 inclusive.

Biz Java 8 aralık kullanır görüyoruz 2000- Varsayılan olarak başına 2099, değil SimpleDateFormat aralığı -80 yıl kadar bugün için 20 yıl kadar.

Yapılandırmak isterseniz, appendValueReduced()'u kullanmanız gerekir. Bu uygunsuz bir şekilde tasarlanmış, ancak mümkün olduğu, buraya bakın:

String s = "150790"; 

// old code with base range 2000-2099 
DateTimeFormatter dtf1 = 
    new DateTimeFormatterBuilder().appendPattern("ddMMyy").toFormatter(); 
System.out.println(dtf1.parse(s)); // 2090-07-15 

// improved code with base range 1935-2034 
DateTimeFormatter dtf2 = 
    new DateTimeFormatterBuilder().appendPattern("ddMM") 
    .appendValueReduced(
    ChronoField.YEAR, 2, 2, Year.now().getValue() - 80 
).toFormatter(); 
System.out.println(dtf2.parse(s)); // 1990-07-15 

arada, gerçekten yerine y veya uygun alan IsoFields.WEEK_BASED_YEAR Y kullanmak zorunda ardından hafta tabanlı yıl istiyorum. Hafta ile ilgili başka herhangi bir alanınız olmadığı dikkate alındığında, normal takvim yılını, hafta bazında değil, varsaymak isterim.

İlgili konular