2010-04-27 11 views
41

Cómo especificar la cadena de formato para convertir solo la fecha de la cadena. En mi caso, sólo la parte de fecha es relevanteHora de Joda: ¿Cómo convertir String a LocalDate?

construcción como DateTime falla:

String dateString = "2009-04-17"; 
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd"); 
DateTime dateTime = formatter.parseDateTime(dateString); 

con el error java.lang.IllegalArgumentException: Invalid format: "2011-04-17" is too short

Probablemente porque debo utilizar LocalDate lugar. Pero, no veo ningún formateador para LocalDate. ¿Cuál es la mejor manera de convertir String dateString = "2009-04-17"; en LocalDate (o algo más si eso no es la representación derecha)

gracias ...

Respuesta

51

probablemente usted está buscando LocalDate(Object). Es un poco confuso ya que toma un genérico Object, pero los documentos indican que usará un ConverterManager que sepa cómo manejar un String si pasa un String al constructor, p.

LocalDate myDate = new LocalDate("2010-04-28"); 
+7

Sin duda es una entrada Javadoc potencialmente confusa. – SteveD

+0

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

+1

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 ");' –

17

Utilice el método parse(String).

LocalDate date = LocalDate.parse("2009-04-17"); 
1

Esto funcionó para mí:

LocalDate d1 = LocalDate.parse("2014-07-19"); 
LocalDate dNow = LocalDate.now(); // Current date 
+2

¿Cuál es el objetivo de esta respuesta? La respuesta aceptada es mejor, con un código más simple, y también da una explicación. –

1

Usted puede utilizar LocalDate.of con el año, mes y día pasó como argumentos separados:

LocalDate date1 = LocalDate.of(2009, 4, 17); 
LocalDate date2 = LocalDate.of(2009, Month.APRIL, 17); 
7

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.

+0

Esto debería ser una respuesta aceptada. –

+0

Joda claramente statis en javadocs: 'Acepta formatos descritos por la siguiente sintaxis: date-element = std-date-element | ord-date-element | elemento fecha-fecha std-date-element = yyyy ['-' MM ['-' dd]] ord-date-element = yyyy ['-' DDD] week-date-element = xxxx '-W 'ww [' - 'e] '. Creo que este es un comportamiento bastante sensato. – Czar

+0

declarar en los documentos es una cosa, dar una gran falla en la que no caer es otra, creo –

4

en mi caso, la cadena de entrada puede estar en uno de dos formatos.Así que primero intento analizar cadenas con un formato más específico:

String s = "2016-02-12"; 
LocalDateTime ldt; 
try { 
    ldt = LocalDateTime.parse(s, DateTimeFormat.forPattern("YYYY-MM-dd HH:mm")); 
} 
catch (IllegalArgumentException e) { 
    ldt = LocalDateTime.parse(s, DateTimeFormat.forPattern("YYYY-MM-dd")); 
}