Java 是否可以创建一个日期格式化程序,将两位数的年份转换为四位数的年份?

Java 是否可以创建一个日期格式化程序,将两位数的年份转换为四位数的年份?,java,calendar,Java,Calendar,在Java应用程序中,我使用DateFormat实例解析日期输入 DateFormat fmt; fmt = DateFormat.getDateInstance(DateFormat.DEFAULT) // dd.MM.yyyy for de_DE 问题在于,用户坚持在表单31.12.11中输入日期 不幸的是,这被解析为31.12.11。(0011-12-31采用ISO格式)相反,我希望解析的日期变成31.12.2011(2011-12-31采用ISO格式) 我可以修改日期格式以便以这种方

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

DateFormat fmt;
fmt = DateFormat.getDateInstance(DateFormat.DEFAULT)  // dd.MM.yyyy for de_DE
问题在于,用户坚持在表单
31.12.11
中输入日期

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


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

您必须使用dd.MM.yy格式进行解析,然后使用yyy-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);
有关设置模式的更多信息,请参见JavaAPI


这里的解决方案非常简单,可以使用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

是的,您可以使用DateFormat.SHORT而不是默认值进行分析


或者,尝试使用SHORT解析,如果不起作用,则尝试其他格式。

您可以使用SimpleDataFormat解析此日期,但如何确定是1911年还是2011年或其他任何日期。您应该使用yyyy格式。

如果您使用GWT,您没有访问SimpleDataFormat的权限,因此下面是一些手动执行此操作的代码:

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);
}
这假设您已验证日期文本以空格分隔。

近似值:

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

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

可能适合也可能不适合您的需要…

我的问题似乎有点模棱两可。我不希望使用ISO格式的字符串表示,我希望日期具有正确的年份(2011年而不是11年,即+2.000年)。我不确定java将如何将11作为2011年,而不是1911年或任何其他值。@asgs:josh.trow提供的链接至少为
SimpleDateFormat
回答了这个问题。实例的创建时间用于启发式地选择世纪。
对于使用缩写年模式(“y”或“yy”)进行解析,SimpleDataFormat必须解释相对于某个世纪的缩写年。它通过将日期调整为SimpleDataFormat实例创建前80年和创建后20年内来实现这一点。
-这太棒了。谢谢你的提示。答案是正确的,但我会使用SHORT而不是“dd.mm.yy”。调用
set2DigitYearStart
只会覆盖80-20启发式。实际的解决方案是使用
yy
模式,而不是
yyy