Как заставить DateFormat угадать намеченный век?

Я пытаюсь разобратьString в "dd-MM-yy"; отформатировать вDate объект. Проблема в том, что он пытается угадать столетие для даты.

Если указано от 01 до 31, год интерпретируется как 2000-е годы (21-й век), а 32 0 99 считается 1900-ми (20-й век).

SimpleDateFormat fm =new SimpleDateFormat("dd-MM-yy");
String datestr="21-11-31";
try {
  Date date= fm.parse(datestr);
  System.out.println(date);
} catch (ParseException e) {
}

Может кто-нибудь мне помочь? Как я могу указать, что я работаю только в 21 веке аккуратно. Я не пытаюсь искать хитрости, такие как манипулирование строкой или смещение даты в зависимости от условия.

Ответы на вопрос(2)

Отдокументация:

For parsing with the abbreviated year pattern ("y" or "yy"), SimpleDateFormat must interpret the abbreviated year relative to some century. It does this by adjusting dates to be within 80 years before and 20 years after the time the SimpleDateFormat instance is created. For example, using a pattern of "MM/dd/yy" and a SimpleDateFormat instance created on Jan 1, 1997, the string "01/11/12" would be interpreted as Jan 11, 2012 while the string "05/04/64" would be interpreted as May 4, 1964. During parsing, only strings consisting of exactly two digits, as defined by Character.isDigit(char), will be parsed into the default century. Any other numeric string, such as a one digit string, a three or more digit string, or a two digit string that isn't all digits (for example, "-1"), is interpreted literally. So "01/02/3" or "01/02/003" are parsed, using the same pattern, as Jan 2, 3 AD. Likewise, "01/02/-3" is parsed as Jan 2, 4 BC.

Кажется, он не упоминает ни одного способа настройки[-80; +20] спектр. Я подозреваю, что ваша лучшая ставка - расширить двузначный год в четырехзначную форму:

datestr = datestr.replaceFirst("-(\\d{2})$", "-20$1");

Вы можете изменить столетие, которое он использует для интерпретации ввода двузначных данных с помощьюset2DigitYearStart() метод.

SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yy");
String aDate = "03/17/40";
Calendar cal = Calendar.getInstance();
cal.clear();
cal.set(Calendar.YEAR, 2000);
dateFormat.set2DigitYearStart(cal.getTime());
System.out.println(dateFormat.get2DigitYearStart());
System.out.println(dateFormat.parse(aDate));

Напечатает 17 марта 2040 года.

ВАШ ОТВЕТ НА ВОПРОС