使用 Java8 将年份字符串解析为 LocalDate

Posted

技术标签:

【中文标题】使用 Java8 将年份字符串解析为 LocalDate【英文标题】:Parsing a year String to a LocalDate with Java8 【发布时间】:2017-05-12 12:02:40 【问题描述】:

有了 Joda 库,你可以做到

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

在 2008 年 1 月 1 日创建 LocalDate

用Java8,你可以尝试做

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

但解析失败:

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

有没有其他选择,而不是专门写某事

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

?

【问题讨论】:

自己写方法? 【参考方案1】:
    String yearStr = "2008";
    Year year = Year.parse(yearStr);
    System.out.println(year);

输出:

2008

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

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

2008-01-01

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

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

结果是一样的。

如果您从一开始就需要LocalDate,greg449’s answer 是正确的,也是您应该使用的。

【讨论】:

【参考方案2】:

LocalDate 解析要求指定所有的年、月和日。

您可以使用DateTimeFormatterBuilderparseDefaulting 方法指定月份和日期的默认值:

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

LocalDate.parse("2008", format);

【讨论】:

【参考方案3】:

我没找到你 但从标题我认为你想将一个字符串解析为一个本地日期,所以这就是你的做法

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

String date = "16/08/2016";

//convert String to LocalDate
LocalDate localDate = LocalDate.parse(date, formatter);

【讨论】:

我的问题是专门关于解析一年的。我展示了一个使用 Joda 时间的工作示例,但要求以类似的方式使其与 java8 一起工作(没有 joda 时间)。基本上,我在问为什么在 Java8 中将仅一年的字符串解析为 LocalDate 不起作用。 你能把代码贴出来看看为什么它不起作用! 已编辑以显示异常。也许答案只是 Joda 时间在这种情况下是一年中的第一天,但​​是 java8 会抛出异常,因为它缺少创建 LocalDate 的数据。我很好,如果有人可以确认这是预期的行为......

以上是关于使用 Java8 将年份字符串解析为 LocalDate的主要内容,如果未能解决你的问题,请参考以下文章

Java 8 – 使用 TimeZone 从 LocalDateTime 创建 Instant [重复]

java8中的常用日期操作

如何用2位数年份解析字符串日期?

Java 8 使用

如何使用java在mysql服务器中插入年份数据类型

将列字符串转换/解析为日期时间值 - 熊猫