2016-01-15 4 views
1

Я хочу подтвердить дату в формате yyyy-MM-dd. Если я даю две цифры за год (т. Е. YY вместо YYYY), он не бросает никаких исключений, а 00 добавляется к формату даты при разборе даты.Дата Валидация формата не работает для yyyy-MM-dd

Я добавил setLenient(false);, но все еще не проверяется правильно.

Может ли кто-нибудь помочь мне в этом?

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); 
formatter.setLenient(false); 
try { 
    Date date = (Date)formatter.parse("15-05-30"); //In this line year is getting appened with 00 and becomes 0015 
    reciptDate = dateFormat.format(date); 
} catch (ParseException pe) { 
    return false; 
} 
+0

А почему вы просто не разобрать ' "2015-05-30" '? Есть ли причина, по которой вам нужен другой «SimpleDateFormat», чем тот, который вам действительно нужен? – LordAnomander

+1

Мы хотим сделать какое-то исключение в случае, если формат не совпадает с yyyy-MM-dd – kana

+0

http://stackoverflow.com/questions/18534343/why-simpledateformatmm-dd-yyyy-parses-date-to-10- 20-20128 Посмотрите эту ссылку. Вероятно, вы должны определить дополнительную проверку, если год меньше, чем, скажем, 2000. Кроме того, 15 - действительное число в течение года. – LordAnomander

ответ

2

В API docs for SimpleDateFormat определяет, для года:

Для синтаксического анализа, если число букв образца больше, чем 2, год интерпретируется буквально, независимо от количества цифр. Таким образом, используя шаблон «MM/DD/YYYY», «01/11/12» разбирает Яну 11, 12 AD

Таким образом, вы не можете использовать SimpleDateFormat как есть, чтобы выполнить проверку вы хотите (обратите внимание, что 1, 2 или 3-значные годы являются действительными годами, а значит> 4-значные годы, но я предполагаю, что это не подходит для вопроса).

Утверждение, что у вас ровно 4 цифры года, должно быть тривиально, чтобы сделать это с помощью регулярного выражения.

Например:

Pattern pattern = Pattern.compile("[0-9]{4}-[0-9]{2}-[0-9]{2}"); 

System.out.println("15-05-30: " + pattern.matcher("15-05-30").matches()); 
System.out.println("2015-05-30: " + pattern.matcher("2015-05-30").matches()); 
System.out.println("0015-05-30: " + pattern.matcher("0015-05-30").matches()); 

Выходы:

15-05-30: false 
2015-05-30: true 
0015-05-30: true 
2

Если вы работаете на Java-8 можно указать минимальную ширину года компонента .

DateTimeFormatter fmt = new DateTimeFormatterBuilder() 
    .appendValue(ChronoField.YEAR, 4, 4, SignStyle.NEVER) 
    .appendPattern("-MM-dd") 
    .toFormatter(); 
LocalDate date = LocalDate.parse("15-05-30", fmt); 

Сообщение об ошибке:

Исключение в потоке "главный" java.time.format.DateTimeParseException:

Текст '15 -05-30' не может быть разобрано по индексу 0

на java.time.format.DateTimeFormatter.parseResolved0 (DateTimeFormatter.java:1949)

на java.time.format.D ateTimeFormatter.parse (DateTimeFormatter.java:1851)

на java.time.LocalDate.parse (LocalDate.java:400)