繁体   English   中英

如何使用 java.time 解析年份和季度的日期

[英]How to parse date from year and quarter using java.time

我正在尝试将格式为“<year> <quarter>”(“2022 1”,“2022 2”)的字符串解析为 java.time.LocalDate 对象。 我能找到的最接近的相关问题是这个,但作者也有月份。 如果我尝试使用

DateTimeFormatter quarterFormatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy q")
.parseDefaulting(ChronoField.DAY_OF_MONTH, 1).toFormatter();
LocalDate.parse("2022 2", quarterFormatter);

我收到错误java.time.format.DateTimeParseException: (...) Unable to obtain LocalDate from TemporalAccessor: {Year=2022, QuarterOfYear=2, DayOfMonth=1} ,这对我来说真的没有意义,因为那是计算日历日期所需的所有数据。 我究竟做错了什么?

另外,作为一个相关问题,原始格式实际上在年份和季度之间没有空格,但是如果我尝试运行

DateTimeFormatter quarterFormatter = new DateTimeFormatterBuilder()
.appendPattern("yyyyq")
.parseDefaulting(ChronoField.DAY_OF_MONTH, 1).toFormatter();
LocalDate.parse("20222", quarterFormatter);

我得到java.time.format.DateTimeParseException: Text '20222' could not be parsed at index 0 这也令人困惑,因为即使没有分隔符,从其他格式解析似乎也能正常工作。

以下是评论中给出的信息的汇编:

为什么我会收到无法获取 LocalDate消息? 以及如何解决?

那是因为解析器没有所有必要的信息,正如 OH GOD SPIDERS 已经说过的:

并不真地。 Year=2022,QuarterOfYear=2,DayOfMonth=1 可以是 2022-04-01,或 2022-05-01 或 2022-06-01。 季度不是特定的月份。

Ole VV 提到了如何修复它:

只需.parseDefaulting(IsoFields.DAY_OF_QUARTER, 1)而不是您收到的parseDefaulting调用。 然后您将获得2022-04-01 ,即第二季度的第一天。

如何修复无法在索引 0 处解析文本“20222”错误?

正如 Ole VV 所提到的:

DateTimeFormatter不擅长将yyyy字段与其他字段分开。 对于20222的相关问题,您可以使用

new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4).appendValue(IsoFields.QUARTER_OF_YEAR, 1).parseDefaulting(IsoFields.DAY_OF_QUARTER, 1).toFormatter()

(格式化我的。)

@OleV.V。 评论包含使用.parseDefaulting(IsoFields.DAY_OF_QUARTER, 1)的正确解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM