使用Java8将一年String解析为LocalDate

fac*_*ndu 7 jodatime java-8 localdate

有了Joda图书馆,你可以做到

DateTimeFormat.forPattern("yyyy").parseLocalDate("2008")
Run Code Online (Sandbox Code Playgroud)

这将在2008年1月1日创建一个LocalDate

使用Java8,您可以尝试

LocalDate.parse("2008",DateTimeFormatter.ofPattern("yyyy"))
Run Code Online (Sandbox Code Playgroud)

但是无法解析:

Text '2008' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {Year=2008},ISO of type java.time.format.Parsed
Run Code Online (Sandbox Code Playgroud)

有没有其他选择,而不是特别写...

LocalDate.ofYearDay(Integer.valueOf("2008"), 1)
Run Code Online (Sandbox Code Playgroud)

gre*_*449 11

LocalDate 解析需要指定所有年,月和日.

您可以使用DateTimeFormatterBuilder和使用parseDefaulting方法指定月和日的默认值:

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

LocalDate.parse("2008", format);
Run Code Online (Sandbox Code Playgroud)


Ole*_*.V. 7

    String yearStr = "2008";
    Year year = Year.parse(yearStr);
    System.out.println(year);
Run Code Online (Sandbox Code Playgroud)

输出:

2008年

如果您需要的是一种表示年份的方法,那么LocalDate这不是适合您的目的的类。java.time包括一个Year完全适合您的课程。请注意,我们甚至不需要显式格式化程序,因为显然您的年份字符串是年份的默认格式。如果以后您想转换,那也很容易。转换为一年的第一天,就像 Joda-Time 会给你的:

    LocalDate date = year.atDay(1);
    System.out.println(date);
Run Code Online (Sandbox Code Playgroud)

2008-01-01

如果您发现以下内容更具可读性,请改用它:

    LocalDate date = year.atMonth(Month.JANUARY).atDay(1);
Run Code Online (Sandbox Code Playgroud)

结果是一样的。

如果您LocalDate从一开始就需要一个,greg449 的答案是正确的,您应该使用它。