簡體   English   中英

Joda Time並根據pivot正確解析兩位數年份

[英]Joda Time & parsing two digit year correctly based on pivot

我有以下(稍微縮寫)代碼來解析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

可能值得注意的是,如果我從DateTimeFormatterBuilder鏈中刪除appendTwoDigitYear ,輸入會成功解析,但120100變為12/01/0000 ,但這不是我需要的。

我誤解了Joda Time API嗎? appendTwoDigitYear使用1950年的樞軸處理將兩個數字作為1900年appendTwoDigitYear數字?

當你使用像這樣的模式

DateTimeFormat.forPattern("MMddyyyy")

它可以讀取像"120100"這樣的日期。 它的作用是讀取12MM ,則01dd ,和00作為一個文字值yyyy ,即。 0開始,在一年0 ,所以0000

因為該模式出現在parsers數組中的MMddyy之前,所以它將用於解析日期字符串。

您想要做的事情,以及重新排序或刪除該格式,是使用一個支點年。

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);       
}

版畫

1900-12-01T00:00:00.000-05:00

我還在試圖弄清楚appendTwoDigitYear是如何工作的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM