2

我无法实现日期的“简单”解析。要求是允许输入两位或四位数字的年份。当输入两位数字时,将分割日期用于决定它属于哪个世纪,它属于明年一月的第一天。这是我到目前为止所拥有的:

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 我得到这句话

附加一个打印机和一组匹配的解析器。解析时,选择列表中的第一个解析器进行解析。如果失败,则选择下一个,依此类推。如果这些解析器都没有成功,则返回取得最大进展的解析器的失败位置。

基于此,第一个解析器应该已经完成​​了这项工作,但看起来第二个解析器被触发并且它失败了,因为它预计更长的年份。

任何帮助将不胜感激。干杯托马斯

4

1 回答 1

1

所以看起来没有人有足够的兴趣来回答,所以我不得不自己想办法:-)。我应该在 JavaDoc 中向下滚动一点,我应该很快就会得到答案。还有另一个appendTwoDigitYear方法可以完成我所追求的工作。

所以这是我现在使用的代码

DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendDayOfMonth(1).appendLiteral("/").appendMonthOfYear(1).appendLiteral("/").appendTwoDigitYear(pivotYear, true).toFormatter().withLocale(new Locale("en", "NZ"));
DateMidnight birthDate = new DateMidnight(formatter.parseDateTime(dateOfBirth));

希望它会在未来对某人有所帮助。

干杯托马斯

于 2013-04-14T21:44:18.993 回答