使用 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
解析要求指定所有的年、月和日。
您可以使用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);
【讨论】:
【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章