使用pivotYear设置为2位数年份的多种格式解析日期

时间:2013-04-11 02:55:00

标签: datetime jodatime date-parsing

我无法实现日期的“简单”解析。要求是允许以两位或四位数输入年份。当输入两位数字时,将分割日期确定为它属于明年1月的第一个世纪。以下是我到目前为止的情况:

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年4月11日)和dateOfBirth = "01/01/14"它返回2014-01-01T00:00:00.000+13:00。预期结果为1914-01-01T00:00:00.000+13:00

当我查看JavaDoc for the append method时,我看到了这句话

  

打印机和解析器接口是其中的低级部分   格式化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”太短     at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:866)

从同一个javadoc我得到这句话

  

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

基于此,第一个解析器应该已经接受了这个工作,但看起来第二个解析器被触发了,它失败了,因为它需要更长的一年。

任何帮助都将深表感谢。 干杯 托马斯

1 个答案:

答案 0 :(得分: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));

希望将来会帮助某人。

干杯 托马斯