[英]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
。 这也令人困惑,因为即使没有分隔符,从其他格式解析似乎也能正常工作。
以下是评论中给出的信息的汇编:
那是因为解析器没有所有必要的信息,正如 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
,即第二季度的第一天。
正如 Ole VV 所提到的:
DateTimeFormatter
不擅长将yyyy
字段与其他字段分开。 对于20222
的相关问题,您可以使用new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4).appendValue(IsoFields.QUARTER_OF_YEAR, 1).parseDefaulting(IsoFields.DAY_OF_QUARTER, 1).toFormatter()
(格式化我的。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.