我无法实现日期的“简单”解析。要求是允许以两位或四位数输入年份。当输入两位数字时,将分割日期确定为它属于明年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我得到这句话
附加打印机和一组匹配的解析器。解析时,选择列表中的第一个解析器进行解析。如果失败,则选择下一个,依此类推。如果这些解析器都不成功,则返回进行最大进度的解析器的失败位置。
基于此,第一个解析器应该已经接受了这个工作,但看起来第二个解析器被触发了,它失败了,因为它需要更长的一年。
任何帮助都将深表感谢。 干杯 托马斯
答案 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));
希望将来会帮助某人。
干杯 托马斯