Con la biblioteca Joda, puedes hacer

DateTimeFormat.forPattern("yyyy").parseLocalDate("2008")

Que crea un LocalDate el 1 de enero de 2008

Con Java8, puedes intentar hacer

LocalDate.parse("2008",DateTimeFormatter.ofPattern("yyyy"))

Pero eso no se analiza:

Text '2008' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {Year=2008},ISO of type java.time.format.Parsed

¿Hay alguna alternativa, en lugar de escribir específicamente algo como

LocalDate.ofYearDay(Integer.valueOf("2008"), 1)

?

8
facewindu 28 dic. 2016 a las 11:22

3 respuestas

La mejor respuesta

El análisis LocalDate requiere que se especifique todo el año, mes y día.

Puede especificar valores predeterminados para el mes y el día utilizando un DateTimeFormatterBuilder y utilizando los métodos parseDefaulting:

DateTimeFormatter format = new DateTimeFormatterBuilder()
     .appendPattern("yyyy")
     .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
     .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
     .toFormatter();

LocalDate.parse("2008", format);
15
greg-449 28 dic. 2016 a las 09:02

No te entendí, pero por el título creo que quieres analizar una Cadena a una fecha local, así que así es como lo haces

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/MM/yyyy");

String date = "16/08/2016";

//convert String to LocalDate
LocalDate localDate = LocalDate.parse(date, formatter);
0
Amado 28 dic. 2016 a las 08:28
    String yearStr = "2008";
    Year year = Year.parse(yearStr);
    System.out.println(year);

Salida:

2008

Si lo que necesita es una forma de representar un año, entonces LocalDate no es la clase correcta para su propósito. java.time incluye una clase Year exactamente para ti. Tenga en cuenta que ni siquiera necesitamos un formateador explícito, ya que obviamente su cadena de año está en el formato predeterminado durante un año. Y si en un momento posterior desea convertir, eso también es fácil. Para convertirse en el primer día del año, como Joda-Time te hubiera dado:

    LocalDate date = year.atDay(1);
    System.out.println(date);

2008-01-01

En caso de que encuentre lo siguiente más legible, úselo en su lugar:

    LocalDate date = year.atMonth(Month.JANUARY).atDay(1);

El resultado es el mismo.

Si necesita un LocalDate desde el principio, la respuesta de greg449 es correcta y la que debe usar.

2
Ole V.V. 29 abr. 2018 a las 04:38