hay un problema un tanto sutil bug-ish con usar LocalDate.parse()
o new LocalDate()
. Un fragmento de código vale más que mil palabras. En el siguiente ejemplo en Scala, repliqué que quería obtener una fecha Local en un formato de secuencia aaaaMMdd. LocalDate.parse()
es feliz de darme una instancia de un LocalDate, pero no es la correcta (new LocalDate()
tiene el mismo comportamiento):
scala> org.joda.time.LocalDate.parse("20120202")
res3: org.joda.time.LocalDate = 20120202-01-01
I Give It 2 Feb, 2016, el formato AAAAMMDD y le regreso una fecha del 1 de enero de 20120202. Me voy de la raya aquí: no creo que esto sea lo que debería estar haciendo. Joda usa 'aaaa-MM-dd' como el valor predeterminado, pero implícitamente aceptará una cadena sin caracteres '-', pensando que quiere el 1 de enero de ese año. Eso no parece ser un comportamiento predeterminado razonable para mí.
Dado esto, me parece que el uso de un formateador de fecha joda que no se puede engañar tan fácilmente es una mejor solución para analizar una cadena. Por otra parte, LocalDate.parse()
probablemente debería lanzar una excepción si el formato de fecha no es 'aaaa-MM-dd':
scala> val format = org.joda.time.format.DateTimeFormat.forPattern("yyyyMMdd")
format: org.joda.time.format.DateTimeFormatter = [email protected]
scala> org.joda.time.LocalDate.parse("20120202", format)
res4: org.joda.time.LocalDate = 2012-02-02
esto hará que otros formatos a fallar por lo que no recibe este comportamiento extraño con errores:
scala> val format = org.joda.time.format.DateTimeFormat.forPattern("yyyy-MM-dd")
format: org.joda.time.format.DateTimeFormatter = [email protected]
scala> org.joda.time.LocalDate.parse("20120202", format)
java.lang.IllegalArgumentException: Invalid format: "20120202" is too short
at org.joda.time.format.DateTimeFormatter.parseLocalDateTime(DateTimeFormatter.java:900)
at org.joda.time.format.DateTimeFormatter.parseLocalDate(DateTimeFormatter.java:844)
at org.joda.time.LocalDate.parse(LocalDate.java:179)
... 65 elided
que es un comportamiento mucho más cuerdo de devolver una fecha en el año 20120202.
Sin duda es una entrada Javadoc potencialmente confusa. – SteveD
muchas gracias por el puntero ... Estoy un poco confundido sobre cómo usar ConverterManager. ¿Cómo le paso la cuerda? ¿Necesito agregarle un convertidor parcial? pero dice por defecto que acepta cadenas para conversiones parciales. Si pudieras dar un ejemplo, sería una gran ayuda ... gracias – bsr
Lo siento, mi respuesta no fue lo suficientemente clara, pero parece que lo has descubierto. De hecho, me refería a 'final LocalDate myDate = new LocalDate (" 2010-04-28 ");' –