【问题标题】:Parsing date by multiple formats with pivotYear set up for 2 digit years通过设置为 2 位数年份的 pivotYear 以多种格式解析日期
【发布时间】: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


    【解决方案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));
    

    希望将来能对某人有所帮助。

    干杯 托马斯

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 2013-01-09
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    相关资源
    最近更新 更多