2014-05-22 11 views
42
için

ayrıştırmak nasıl Ayrıştırma tarihleri ​​Java 8 Zaman API'si.Java 8 Zaman API'si: "MM.yyyy" biçimindeki dize LocalDate

java.time.format.DateTimeParseException: Text '04' could not be parsed at index 0 
java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1948) 
java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1850) 
java.time.LocalDate.parse(LocalDate.java:400) 
java.time.LocalDate.parse(LocalDate.java:385) 
com.luxoft.ath.controllers.JsonController.region(JsonController.java:38) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
java.lang.reflect.Method.invoke(Method.java:483) 
org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) 
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749) 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689) 
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:723) 
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 

:

String date = "04.2013"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM.yyyy"); 
LocalDate ld = LocalDate.parse(date, formatter); 

bir istisna alırsınız:

String date = "04.2013"; 
DateFormat df = new SimpleDateFormat("MM.yyyy"); 
Date d = df.parse(date); 

Ama şimdi LOCALDATE kullanmak ve böyle yaparsanız:

Daha önce kolayca yazabilirsiniz Dize biçimini "yyyy-MM-dd" olarak değiştirirsem herşey hatta biçimlendiricisinde olmadan mükemmel çalışır:

String date = "2013-04-12"; 
LocalDate ld = LocalDate.parse(date); 

Yani benim soru: nasıl Java 8 Saat API kullanarak özel biçimde tarih ayrıştırmak için?

cevap

46

Bu mantıklıdır: Girişiniz, bir gün bilgisi olmadığı için gerçekten bir tarih değildir. Onu YearMonth olarak ayrıştırmalı ve günü umursamıyorsanız bu sonucu kullanmalısınız.

String date = "04.2013"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM.yyyy"); 
YearMonth ym = YearMonth.parse(date, formatter); 

belirli bir gün uygulamak gerekir yoksa örneğin bir YearMonth bir LocalDate edinebilirsiniz:

LocalDate ld = ym.atDay(1); 
//or 
LocalDate ld = ym.atEndOfMonth(); 

Ayrıca son günü için, örneğin, bir TemporalAdjuster kullanabilirsiniz ay *:

LocalDate ld = ym.atDay(1).with(lastDayOfMonth()); 

* bir import static java.time.temporal.TemporalAdjusters.lastDayOfMonth;

ile
+2

mantıklı. Sadece bir yıl ve ayı temsil ediyorsanız (kesin tarih ilgisizdir), o zaman sadece 'YearMonth' ile çalışmanız gerekir. Onu, varsayılan olarak "1" değerine dönüştürmek zorunda olduğumuz Java8 öncesi gibi 'LocalDate '' e dönüştürmeniz gerekmez. ':)' – ADTC

+0

@ADTC Gerçekten de açıklığa kavuşturdum. – assylias

+4

'LocalDate ld = ym.atEndOfMonth();' '' 'dır .. Cidden, Java 8 Zaman API'sı (JodaTime) şaşırtıcıdır:) – ADTC

12

ardından alternatif de muhtemelen çok güzel ama en azından bir başarıyla test çözüm değil, bu yüzden eksik ve @assylias sağ cevaba ek olarak burada söz:

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); 
builder.parseDefaulting(ChronoField.DAY_OF_MONTH, 1); 
builder.append(DateTimeFormatter.ofPattern("MM.yyyy")); 
DateTimeFormatter dtf = builder.toFormatter(); 

String ym = "04.2013"; 
LocalDate date = LocalDate.parse(ym, dtf); 
System.out.println(date); // output: 2013-04-01