我正在尝试解析PDF中使用的日期格式。根据此页面,格式如下:
D:YYYYMMDDHHmmSSOHH'mm'
除年份外的所有组件都是可选的。我认为这意味着字符串可以在任何时候被截断,例如指定一年零一小时而不指定一个月和一天对我来说似乎有点毫无意义。此外,这将使解析几乎不可能。
据我所知,Java不支持包含单引号的区域偏移。因此,第一步将是摆脱这些:
D:YYYYMMDDHHmmSSOHHmm
生成的Java日期模式应该是这样的:
['D:']uuuu[MM[dd[HH[mm[ss[X]]]]]]
我的总体代码如下:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("['D:']uuuu[MM[dd[HH[mm[ss[X]]]]]]");
TemporalAccessor temporalAccessor = formatter.parseBest("D:20020101",
ZonedDateTime::from,
LocalDateTime::from,
LocalDate::from,
Month::from,
Year::from
);
我希望这会产生一个LocalDate对象,但我得到的是java.time.format.DateTimeParseException: Text 'D:20020101' could not be parsed at index 2
。
我对此进行了一些尝试,发现一开始使用可选文字时一切都很好,但一旦添加了可选日期组件,就会出现异常。
有人能告诉我我做错了什么吗?
提前感谢!
我找到了一个解决方案:
String dateString = "D:20020101120000+01'00'";
String normalized = dateString.replace("'", "");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("['D:']ppppy[ppM[ppd[ppH[ppm[pps[X]]]]]]");
TemporalAccessor temporalAccessor = formatter.parseBest(normalized,
OffsetDateTime::from,
LocalDateTime::from,
LocalDate::from,
YearMonth::from,
Year::from
);
看起来,组件的长度不明确,因此在没有任何分隔符的情况下解析日期失败。在指定填充时,会清楚地说明每个组件的长度,因此可以解析日期。
至少这是我的理论。