Как заставить 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 веке аккуратно. Я не пытаюсь искать хитрости, такие как манипулирование строкой или смещение даты в зависимости от условия.

 Edge24 мая 2012 г., 08:41
Я реализовал это только путем обработки строк. просто думал, что может быть API способ сделать это
 Affe24 мая 2012 г., 08:50
Есть собственно :)
 nhahtdh24 мая 2012 г., 08:39
Мне любопытно, почему ввод в коротком формате года. Можете ли вы получить вход в формате длинного года? Другим вариантом является добавление «20». в поле года, используя регулярное выражение перед анализом даты. (.replaceFirst (& quot; - (?! -) & quot ;, & quot; -20 & quot;)
 zebediah4924 мая 2012 г., 08:36
Я считаю, что если вы хотите указать, что все даты относятся к 21-му веку, вам, скорее всего, лучше делать глупые манипуляции со строками.s/([0-9]{2}-[0-9]{2})-([0-9]{2})/$1-20$2/.

Ответы на вопрос(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");
 24 мая 2012 г., 08:41
@Edge: отвечает на заголовок вашего вопроса. Вопрос о том, что он делает, сильно отличается от вопроса оchanging что оно делает.
 24 мая 2012 г., 08:37
@ Край: см. Абзац внизу моего ответа.
 Edge24 мая 2012 г., 08:37
Я понимаю это, но это действительно не отвечает на мой вопрос. Можем ли мы иметь аккуратный способ сообщить JVM, если мы работаем в конкретном веке
 24 мая 2012 г., 08:35
Пусть API благословит наше понимание этих святых слов. Аминь.
 24 мая 2012 г., 08:38
Не думаю, что с SimpleDateFormat. Вы полностью можете с вашим классом EdgeDateFormat, который вы собираетесь написать, чтобы решить эту проблему ...
Решение Вопроса

Вы можете изменить столетие, которое он использует для интерпретации ввода двузначных данных с помощью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 года.

 24 мая 2012 г., 08:54
+1 - Хорошая находка. Надеюсь, поезд upvote возвращается :)
 24 мая 2012 г., 09:24
Если вы просто рассчитаете 2000 год и сохраните его на заводе, вы можете исключить затраты на календарные операции и скрыть беспорядок. Работает в любом случае!
 Edge24 мая 2012 г., 08:56
Я на самом деле искал это. Хотя это выглядит грязно (вероятно, я просто буду придерживаться манипуляции строк), но это отвечает на мой предполагаемый вопрос, который я не знал о get2DigitYearStart (). Thanx

Ваш ответ на вопрос