Java 8 de l'API du Temps: comment analyser la chaîne de format “MM aaaa” pour LocalDate
Je suis un peu découragé par l'analyse des dates dans Java 8 de l'API du Temps.
Précédemment, je pourrais facilement écrire:
String date = "04.2013";
DateFormat df = new SimpleDateFormat("MM.yyyy");
Date d = df.parse(date);
Mais maintenant si j'utilise LocalDate et de faire comme ceci:
String date = "04.2013";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM.yyyy");
LocalDate ld = LocalDate.parse(date, formatter);
- Je recevoir une exception:
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)
Si je change le format de chaîne "aaaa-MM-jj" tout fonctionne parfaitement, même sans formateur:
String date = "2013-04-12";
LocalDate ld = LocalDate.parse(date);
Donc ma question est: comment analyser la date dans un format personnalisé à l'aide de Java 8 de l'API du Temps?
Vous devez vous connecter pour publier un commentaire.
Il prend tout son sens: votre contribution n'est pas vraiment une date parce qu'elle ne dispose pas d'un jour de l'information. Vous devez l'analyser comme un
YearMonth
et utiliser ce résultat si vous ne se soucient pas de la journée.Si vous avez besoin d'appliquer une date spécifique, vous pouvez obtenir un
LocalDate
à partir d'unYearMonth
par exemple:Vous pouvez également utiliser un
TemporalAdjuster
, par exemple, pour le dernier jour du mois*:*avec un
import static java.time.temporal.TemporalAdjusters.lastDayOfMonth;
YearMonth
. Vous n'avez pas besoin de convertir enLocalDate
contrairement à la pré-Java8 où nous avons eu à le convertir en un par défaut date de1
.:)
LocalDate ld = ym.atEndOfMonth();
trop.. Sérieusement, Java 8 Temps de l'API (JodaTime) est incroyable:)
Alternative suivante est probablement pas très agréable mais au moins un a testé avec succès la solution, trop, donc j'en parle ici par souci d'exhaustivité, et en tant que complément à la réponse de @assylias: