是否可以创建一个将两位数年份转换为四位数年份的DateFormatter?

时间:2011-02-28 15:12:42

标签: java calendar

在我的Java应用程序中,我使用DateFormat实例来解析日期输入。

DateFormat fmt;
fmt = DateFormat.getDateInstance(DateFormat.DEFAULT)  // dd.MM.yyyy for de_DE

问题是用户坚持以31.12.11的形式输入日期。

不幸的是,这被解析为31.12.11。 (ISO格式的0011-12-31)相反,我希望解析的日期变为31.12.2011(ISO格式为2011-12-31)。

我可以修改日期格式以某种方式解析输入吗?

6 个答案:

答案 0 :(得分:11)

您必须使用dd.MM.yy格式进行解析,并使用yyyy-MM-dd格式重新格式化

DateFormat sdfp = new SimpleDateFormat("dd.mm.yy");
Date d = sdfp.parse(input);
DateFormat sdff = new SimpleDateFormat("yyyy-MM-dd");
String date = sdff.format(d);

有关设置模式的详细信息,请参阅Java API。

http://download.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

答案 1 :(得分:5)

此处的解决方案非常简单,允许使用SimpleDateFormat,其中包含方法set2DigitYearStart(Date startDate)。也许它看起来像这样。

String userInput = "31.12.11";
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yy");
format.set2DigitYearStart(new GregorianCalendar(2001,1,1).getTime());
Date userEnteredDate = format.parse(userInput, 1); // parsed to 2011-12-31

答案 2 :(得分:1)

是的,您可以使用DateFormat.SHORT而不是DEFAULT进行解析。

或者可能尝试使用SHORT进行解析,然后尝试其他格式,如果这不起作用。

答案 3 :(得分:1)

您可以使用SimpleDateFormat解析此日期,但您将如何确定1911年或2011年或其他任何内容。你应该使用年份格式作为yyyy。

答案 4 :(得分:1)

如果您使用GWT,则无法访问SimpleDateFormat,因此这里有一些代码可以手动执行:

String[] parts = dateText.split(" ");

// Convert 2 digit date to 4 digits
if (parts.length == 3 && parts[2].length() == 2) {
    int year = Integer.valueOf(parts[2]);

    // Allow 5 years in the future for a 2 digit date
    if (year + 100 > new Date().getYear()+5) {
        year = year + 1900;
    }
    else {
        year = year + 2000;
    }
    dateText = parts[0] + " " + parts[1] + " " + String.valueOf(year);
}

这假设您已经验证dateText是用空格分隔的。

答案 5 :(得分:0)

近似值:

int twoDigitYear = 11;
int fourDigitYear = 0;
DateTime now = new DateTime();

if (twoDgYear + 2000 > now().getYear()) {
   fourDigitYear = twoDigitYear + 1900;
}else{
   fourDigitYear = twoDigitYear + 2000;
}

可能或可能不符合您的需要...