确定解析时间的精度(有效数字)

Determinate the precision (significant digits) of parsed temporal

我正在处理不同年表之间的动态日期格式转换,例如将110/02(民国年表)转换为2021/02(ISO年表)或反向。日期和模式都在运行时给出。

时间顺序转换要求时间为完整日期,否则抛出异常:

DateTimeFormatter isoFmt = DateTimeFormatter.ofPattern("[y/]MM").withChronology(IsoChronology.INSTANCE);
DateTimeFormatter rocFmt = DateTimeFormatter.ofPattern("[y/]MM").withChronology(MinguoChronology.INSTANCE);

// same chronology, works without issue
rocFmt.parse("110/02").query(rocFmt::format);
isoFmt.parse("2021/02").query(isoFmt::format);

// different chronology, exception thrown
rocFmt.parse("110/02").query(isoFmt::format);
isoFmt.parse("2021/02").query(rocFmt::format);

DateTimeException: Unable to apply override chronology 'Minguo' because the temporal object being formatted contains date fields but does not represent a whole date

基于 LocalDate(使用 IsoChronology)的操作也失败了:

rocFmt.parse("110/02").query(YearMonth::from);
rocFmt.parse("110/02").query(Month::from);

DateTimeException: Unable to obtain YearMonth from TemporalAccessor
Caused by: DateTimeException: Unable to obtain LocalDate from TemporalAccessor:

使用 DateTimeFormatterBuilder 我可以为缺失的部分设置默认值以使其可解析。例如02, 2021会被MM, yyyy解析成2021/02/01,dayOfMonth默认为1,02-20, 2021会被MM-dd, yyyy解析成2021/02/20 .

然而,第 1 天仅用于转换,我们不想要。为了确定我是否应该保留这部分,我正在寻找一种方法来确定解析时间的精度或有效数字。

虽然我可以在转换前检查 dayOfMonth(d) 字段是否存在,但该值也可以从 dayOfYear(D) 或 dayOfWeek(E) 派生给出的字段。

有什么方法可以确定精度或有效数字,以防止有人将日期 2021/02 变成 110/02/01

PS。 MM/dd 的情况暂且搁置。

这是不可能的,抱歉。

一方面,您的期望是相当合理的,因为 Roc/Minguo 日历系统使用与 ISO 相同的月份。两种日历系统之间的区别只是年份数字与 1911 不同。所以转换应该很简单。

另一方面,不同的日历系统通常有不同的月份,因此一个日历系统中的月份不会明确地转换为另一个系统中的月份。相反,这个月经常会与另一个系统中的两个不同月份重叠。这可能就是为什么 Java 拒绝将 Roc 月份转换为 ISO 月份,反之亦然。

我知道假设一个月中的某一天(例如 1)感觉像是一个 hack。不过,这可能是最简单的方法。