Parsing a year String to a LocalDate with Java8

10.2k views Asked by At

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)

?

3

There are 3 answers

0
greg-449 On BEST ANSWER

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);
3
Amado On

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);
0
Anonymous On
    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.