Joda Time并根据pivot正确解析两位数年份

Coo*_*per 4 java datetime 2-digit-year jodatime

我有以下(略有缩写)代码来解析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;
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当用户输入时120100,我希望它能够正确解析并最终在12/01/1900输出.然而,formatter.parseDateTime(input);convertToDateTime抛出一个IllegalArgumentException代替,并且该方法返回null.

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

我误解了Joda Time API吗?不应该appendTwoDigitYear与1950年的枢轴处理00年两年的数字作为1900?

Sot*_*lis 6

当你使用像这样的模式

DateTimeFormat.forPattern("MMddyyyy")
Run Code Online (Sandbox Code Playgroud)

它可以读取日期"120100".它的作用是读取12for MM,01for dd00as作为字面值yyyy,即.0从一年开始0,所以0000.

由于该模式之前,会出现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);       
}
Run Code Online (Sandbox Code Playgroud)

版画

1900-12-01T00:00:00.000-05:00
Run Code Online (Sandbox Code Playgroud)

我还在试图找出appendTwoDigitYear有效的方法.