我无法实现日期的“简单”解析。要求是允许输入两位或四位数字的年份。当输入两位数字时,将分割日期用于决定它属于哪个世纪,它属于明年一月的第一天。这是我到目前为止所拥有的:
DateTime now = new DateTime();
int pivotYear = now.getYear() - 49; // 2013 - 49 = 1964 where 49 is the
DateTimeParser[] parsers = {
DateTimeFormat.forPattern("dd/MM/yy").withPivotYear(pivotYear).withLocale(new Locale("en", "NZ")).getParser(),
DateTimeFormat.forPattern("dd/MM/yyyy").withLocale(new Locale("en", "NZ")).getParser()
};
DateTimeFormatter formatter = new DateTimeFormatterBuilder().append(null, parsers).toFormatter();
DateMidnight birthDate = new DateMidnight(formatter.parseDateTime(dateOfBirth));
不幸的是,它没有达到我的预期。假设今天的日期(2013 年 11 月 4 日),dateOfBirth = "01/01/14"
它返回2014-01-01T00:00:00.000+13:00
. 预期的结果是1914-01-01T00:00:00.000+13:00
当我查看附加方法的 JavaDoc 时,我看到了这句话
打印机和解析器接口是格式化 API 的低级部分。通常,实例是从另一个格式化程序中提取的。但是请注意,此方法不会提取任何格式化程序特定信息,例如语言环境、时区、年表、偏移量解析或基准/默认年份。
所以我决定将 Pivot 的东西移到DateTimeFormatterBuilder
类中,所以现在代码如下所示:
DateTimeParser[] parsers = {
DateTimeFormat.forPattern("dd/MM/yy").getParser(),
DateTimeFormat.forPattern("dd/MM/yyyy").getParser()
};
DateTimeFormatter formatter = new DateTimeFormatterBuilder().append(null, parsers).appendTwoDigitYear(pivotYear).toFormatter().withLocale(new Locale("en", "NZ"));
不幸的是,这不是解决问题。相反,这次失败了
java.lang.IllegalArgumentException:无效格式:“01/01/14”在 org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:866) 处太短
从同一个 javadoc 我得到这句话
附加一个打印机和一组匹配的解析器。解析时,选择列表中的第一个解析器进行解析。如果失败,则选择下一个,依此类推。如果这些解析器都没有成功,则返回取得最大进展的解析器的失败位置。
基于此,第一个解析器应该已经完成了这项工作,但看起来第二个解析器被触发并且它失败了,因为它预计更长的年份。
任何帮助将不胜感激。干杯托马斯