11

With Joda library, you can do

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

that creates a LocalDate at Jan 1st, 2008

With Java8, you can try to do

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

but that fails to parse:

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

Is there any alternative, instead of specifically writing sth like

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

?

facewindu
  • 705
  • 3
  • 11
  • 31

3 Answers3

20

LocalDate parsing requires that all of the year, month and day are specfied.

You can specify default values for the month and day by using a DateTimeFormatterBuilder and using the parseDefaulting methods:

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

LocalDate.parse("2008", format);
greg-449
  • 109,219
  • 232
  • 102
  • 145
7
    String yearStr = "2008";
    Year year = Year.parse(yearStr);
    System.out.println(year);

Output:

2008

If what you need is a way to represent a year, then LocalDate is not the correct class for your purpose. java.time includes a Year class exactly for you. Note that we don’t even need an explicit formatter since obviously your year string is in the default format for a year. And if at a later point you want to convert, that’s easy too. To convert into the first day of the year, like Joda-Time would have given you:

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

2008-01-01

In case you find the following more readable, use that instead:

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

The result is the same.

If you do need a LocalDate from the outset, greg449’s answer is correct and the one that you should use.

Ole V.V.
  • 81,772
  • 15
  • 137
  • 161
0

I didn't get you but from the title I think you want to parse a String to a localdate so this is how you do it

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

String date = "16/08/2016";

//convert String to LocalDate
LocalDate localDate = LocalDate.parse(date, formatter);
Amado
  • 371
  • 1
  • 16
  • My question is specifically about parsing a year. I show a working example with Joda time, but asks for a similar way to make it work with java8 (without joda time). Basically, I'm asking why parsing a year only string to a LocalDate doesn't work in Java8. – facewindu Dec 28 '16 at 08:33
  • can you post the code to check why it's not working ! – Amado Dec 28 '16 at 08:36
  • edited to show the exception. Maybe the answer is just that Joda time takes the first day of the year in that case, but java8 throws an exception because it's missing data to create the LocalDate. I'm fine with that, if someone can confirm this is the intended behaviour ... – facewindu Dec 28 '16 at 08:41