我正在处理不同年表之间的动态日期格式转换,例如将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:无法应用重写年表'Minguo',因为正在格式化的时间对象包含日期字段,但不代表整个日期
基于LocalDate(使用IsoChronology)的操作也失败:
rocFmt.parse("110/02").query(YearMonth::from);
rocFmt.parse("110/02").query(Month::from);
DateTimeException: able to get YearMonth from TemporalAccessor
Caused by: DateTimeException: able to get LocalDate from TemporalAccessor:
与DateTimeFormatterBuilder
我可以设置默认值为缺失的部分,使其可解决。例如,MM, yyyy
将02, 2021
解析为2021/02/01,dayOfMonth默认为1,MM-dd, yyyy
将02-20, 2021
解析为2021/02/20。
然而,第一天只是为了转换,我们不想要。为了确定是否应该保留这部分,我正在寻找一种方法来确定解析时态的精度或有效数字。
虽然我可以检查dayOfMonth(d
)字段是否在转换之前存在,但该值也可以从dayOfYear(D
)或dayOfWeek(E
)派生,并给出额外的字段。
有什么办法可以确定精度或有效数字,这样我就可以防止有人把日期2021/02
变成110/02/01
吗?
p。让我们把MM/dd
的情况放在一边。
这是不可能的,对不起。
一方面,您的期望是相当合理的,因为Roc/Minguo日历系统使用与ISO相同的月份。两种历法的区别只是年份相差1911年。所以转换应该很简单。
另一方面,不同的日历系统通常有不同的月份,因此一个日历系统中的月份不能明确地转换为另一个日历系统中的月份。相反,这个月份经常会与其他系统中的两个不同月份重叠。这可能就是为什么Java拒绝将Roc月份转换为ISO月份,反之亦然的原因。
我理解假设一个月中的某一天(例如1)感觉像是一个hack。这可能是最简单的方法。