Joda Time&根据数据透视正确解析两位数年份

时间:2013-10-02 18:11:51

标签: java datetime jodatime 2-digit-year

我有以下(略有缩写)代码将String输入解析为Joda Time DateTime对象。我需要正确处理多种格式,包括四种格式两位数年。

setupValidDateFormats();
DateTime date = convertToDateTime(thisField.getText());
if (date != null) {
    thisField.setText(date.toString("MM/dd/yyyy"));
} else {
    System.out.println("Invalid date");
}

private void setupValidDateFormats() {
    DateTimeParser[] formats = {
            DateTimeFormat.forPattern("MM/dd/yyyy").getParser(),
            DateTimeFormat.forPattern("MM/dd/yy").getParser(),
            DateTimeFormat.forPattern("MM-dd-yyyy").getParser(),
            DateTimeFormat.forPattern("MM-dd-yy").getParser(),
            DateTimeFormat.forPattern("MMddyyyy").getParser(),
            DateTimeFormat.forPattern("MMddyy").getParser()
    };
    formatter = new DateTimeFormatterBuilder().append(null, formats).appendTwoDigitYear(1950, true).toFormatter()
            .withLocale(Locale.US);
}

private DateTime convertToDateTime(String input) {
    if (isNullOrEmpty(input)) {
        return null;
    }

    DateTime date;
    try {
        // When you parse a date, it'll throw an exception for not only invalid formats,
        // but for invalid values such as 09/31/2013 or 02/30/2013. Leap year is included as well.
        date = formatter.parseDateTime(input);
    } catch (Exception e) {
        // User input a date in the incorrect format, or an invalid value.
        // Example: 02/30/2013 is invalid.
        date = null;
    }

    return date;
}

我遇到的问题是,当用户输入120100时,我希望它能够正确解析并最终在12/01/1900输出。但是,formatter.parseDateTime(input);中的convertToDateTime会引发IllegalArgumentException,而该方法会返回null

可能值得注意的是,如果我从appendTwoDigitYear链中删除DateTimeFormatterBuilder,则输入会成功解析,但120100会变为12/01/0000,但这不是我需要的

我是否误解了Joda Time API?不应该使用1950年代的appendTwoDigitYear将00年两年的数字作为1900处理?

1 个答案:

答案 0 :(得分:6)

使用

之类的模式时
DateTimeFormat.forPattern("MMddyyyy")

它可以读取"120100"之类的日期。它的作用是阅读12的{​​{1}},MM的{​​{1}}和00 as a literal value for yyyy, ie. 0 starting at year 0, so 0000

由于该模式显示在01数组中的dd之前,因此它将用于解析您的日期字符串。

您要做的事情,以及重新排序或删除该格式,都是使用支点年份。

MMddyy

打印

parsers

我仍在试图弄清public static void main(String[] args) throws Exception { String str = "120100"; DateTimeParser[] formats = { DateTimeFormat.forPattern("MM/dd/yyyy").getParser(), DateTimeFormat.forPattern("MM/dd/yy").getParser(), DateTimeFormat.forPattern("MM-dd-yyyy").getParser(), DateTimeFormat.forPattern("MM-dd-yy").getParser(), DateTimeFormat.forPattern("MMddyy").getParser() }; DateTimeFormatter formatter = new DateTimeFormatterBuilder().append(null, formats).toFormatter() .withPivotYear(1950).withLocale(Locale.US); DateTime dateTime = formatter.parseDateTime(str); System.out.println(dateTime); } 的工作原理。