【发布时间】:2013-04-15 05:44:18
【问题描述】:
我无法实现日期的“简单”解析。要求是允许输入两位或四位数字的年份。当输入两位数时,然后将拆分日期确定为明年一月的第一天属于哪个世纪。这是我目前所拥有的:
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));
不幸的是,它没有达到我的预期。假设今天的日期 (11/04/2013) 和 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”太短 在 org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:866)
从同一个 javadoc 我得到这句话
附加一个打印机和一组匹配的解析器。解析时,选择列表中的第一个解析器进行解析。如果失败,则选择下一个,依此类推。如果这些解析器都没有成功,则返回取得最大进展的解析器的失败位置。
基于此,第一个解析器应该已经完成了这项工作,但看起来第二个解析器被触发并且它失败了,因为它预计更长的年份。
任何帮助将不胜感激。 干杯 托马斯
【问题讨论】:
标签: datetime jodatime date-parsing