java - 使用 ThreeTen-Extra 解析 YearQuarter 时是否可以拒绝多个四分位数字?

标签 java java-time

我正在使用 YearQuarter来自 ThreeTen-Extra表示给定年份中特定季度的图书馆。

我使用的是自定义格式而不是默认格式,例如2018 年第三季度的“3Q2018”而不是“2018-Q3”。通过 YearQuarter.parse(text, formatter) 解析值时,我希望该季度的前导零值被拒绝(通过标准 DateTimeParseException )。

我的第一次尝试是使用 DateTimeFormatter.ofPattern("Q'Q'yy")。但是,这接受在四分之一前面有任意多个前导零的字符串。例如,“02Q2007”和“002Q2007”都不会被此格式化程序拒绝。

这似乎与其他时间类型的单字符模式处理方式一致。例如,这些成功解析且没有错误:

YearMonth.parse("012-2018", DateTimeFormatter.ofPattern("M-yyyy"))
LocalTime.parse("001:00:01", DateTimeFormatter.ofPattern("H:mm:ss"))
LocalTime.parse("01:00:012", DateTimeFormatter.ofPattern("HH:mm:s"))

但是,这些拒绝带有 DateTimeParseException 的输入:

YearMonth.parse("012-2018", DateTimeFormatter.ofPattern("MM-yyyy"))
LocalTime.parse("001:00:01", DateTimeFormatter.ofPattern("HH:mm:ss"))
LocalTime.parse("01:00:012", DateTimeFormatter.ofPattern("HH:mm:ss"))

我如何构造一个 DateTimeFormatter以我想要的格式解析 YearQuarter,同时拒绝该季度超过一位数字的值?理想情况下,我想将其作为模式字符串来执行,因为它们更易于人类阅读,并且更容易作为文本属性外化。

最佳答案

我还没有发现将此作为模式字符串执行此操作的方法,但以下内容将以编程方式构建具有所需格式的 DateTimeFormatter,拒绝以 0 填充的四分之一:

import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.time.temporal.IsoFields;

[...]

new DateTimeFormatterBuilder()
    .appendValue(IsoFields.QUARTER_OF_YEAR, 1)
    .appendLiteral('Q')
    .appendValue(ChronoField.YEAR, 4)
    .toFormatter();

关于java - 使用 ThreeTen-Extra 解析 YearQuarter 时是否可以拒绝多个四分位数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52395772/

相关文章:

java - 正则表达式匹配空白表

java - 无法在索引 20 处解析文本 '2021-06-22T18:27:03.5577Z'

java - 找不到 : java. time.LocalDateTime(java.lang.String) 的匹配构造函数

java - ConcurrentHashMap 是否可能为 "deadlock"?

java - 将字符串写入 .txt 文件不起作用

java - 如何从 Spring Security 中的 java 代码登录用户?

Java泛型与无界通配符?

java - 使用 Java 8 将字符串转换为 DateTime 对象

java - 如何获取DST间隙和重叠?

Java DateTimeFormatter.ISO_OFFSET_DATE_TIME 输出与 Java 文档不同