Datetime 将数据透视年设置为2位数年,按多种格式分析日期

Datetime 将数据透视年设置为2位数年,按多种格式分析日期,datetime,jodatime,date-parsing,Datetime,Jodatime,Date Parsing,我很难实现日期的“简单”解析。要求允许以两位或四位数字输入年份。当输入两位数字时,将决定进入哪个世纪的分割日期定为明年1月1日。以下是我到目前为止的情况: DateTime now = new DateTime(); int pivotYear = now.getYear() - 49; // 2013 - 49 = 1964 where 49 is the DateTimeParser[] parsers = { DateTimeFormat.forPattern("dd/MM/yy"

我很难实现日期的“简单”解析。要求允许以两位或四位数字输入年份。当输入两位数字时,将决定进入哪个世纪的分割日期定为明年1月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

当我看句子的时候,我看到了这个句子

打印机和解析器接口是系统的底层部分 格式化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我得到了这个句子

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

基于这一点,第一个解析器应该已经完成了任务,但是看起来第二个解析器已经被触发,并且失败了,因为它需要更长的时间

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

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

这是我现在使用的代码

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));
希望它能在将来帮助别人

干杯
托马斯

我也遇到了类似的问题,但奇怪的是,你的解决方案似乎对我不起作用。我不得不就此提出一个新问题