2015-10-12 6 views
9

Есть ли все равно, чтобы подтвердить, является ли заданная дата (yyyy-MM-dd) действительной датой? Он тоже должен справиться с високосным годом. например (2015-02-29), должны быть недействительными. Я получаю дату в виде строки и помещаю ее в объект joda DateTime.Java date validation joda time

+2

смотрите http://stackoverflow.com/questions/226910/how-to-sanity-check-a-date-in-java, а точнее @tardate response – mdm

+0

используете ли вы java 8? – Satya

+0

@Satya Я использую java 7 – root

ответ

8

Это должно работать для вас, я думаю, что (если вы хотите сохранить его простым).
Вы должны сделать setLenient(false) на SimpleDateFormat.

public static boolean validateDate(String dateString){ 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
    sdf.setLenient(false); 
    try { 
     sdf.parse(dateString); 
     return true; 
    } catch (ParseException ex) { 
     return false; 
    } 
} 
+0

FYI, неприятные старые классы времени, такие как ['java.util.Date'] (https://docs.oracle.com/javase/9/docs/api/java/util/Date.html), [ 'java.util.Calendar'] (https://docs.oracle.com/javase/9/docs/api/java/util/Calendar.html) и' java.text.SimpleDateFormat' теперь [наследие] (https://en.wikipedia.org/wiki/Legacy_system), вытесненный [java.time] (https://docs.oracle.com/javase/9/docs/api/java/time/package-summary. html), встроенные в Java 8 и Java 9. См. [Учебное пособие по Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

5

Использование SimpleDateFormat

public boolean valiDate(String dateString){ 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
    sdf.setLenient(false); 
    try { 
     Date date = sdf.parse(dateString); 
     return true; 
    } catch (ParseException ex) { 
     return false; 
    } 
} 
+0

Вам не хватало 'setLenient (false)' в оригинальный ответ. Во всяком случае, +1 от меня. –

+1

FYI, неприятные старые классы времени, такие как ['java.util.Date'] (https://docs.oracle.com/javase/9/docs/api/java/util/Date.html), [ 'java.util.Calendar'] (https://docs.oracle.com/javase/9/docs/api/java/util/Calendar.html) и' java.text.SimpleDateFormat' теперь [наследие] (https://en.wikipedia.org/wiki/Legacy_system), вытесненный [java.time] (https://docs.oracle.com/javase/9/docs/api/java/time/package-summary. html), встроенные в Java 8 и Java 9. См. [Учебное пособие по Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

9

Предыдущие ответы должны быть в порядке, но, учитывая, что ОП специально попросили Joda-Time версии, эта альтернатива будет также работать:

@Test 
public void test() { 

    String testDateOk = "2015-02-25"; // Normal date, no leap year 
    String testDateOk2 = "2016-02-29"; // Edge-case for leap year 
    String testDateWrong = "2017-02-29"; // Wrong date in a non-leap year 
    String testDateInvalid = "2016-14-29"; // plain wrong date 

    assertTrue(isValidDate(testDateOk)); 
    assertTrue(isValidDate(testDateOk2)); 
    assertFalse(isValidDate(testDateWrong)); 
    assertFalse(isValidDate(testDateInvalid)); 
} 

boolean isValidDate(String dateToValidate){ 
    String pattern = "yyyy-MM-dd"; 

    try { 
     DateTimeFormatter fmt = DateTimeFormat.forPattern(pattern); 
     fmt.parseDateTime(dateToValidate); 
    } catch (Exception e) { 
     return false; 
    } 
    return true; 
} 
+0

Лучше поймать 'IllegalArgumentException', а не любое старое исключение. – jhericks

+0

FYI, проект [Joda-Time] (http://www.joda.org/joda-time/) теперь находится в [режиме обслуживания] (https://en.wikipedia.org/wiki/Maintenance_mode), с команда, предлагающая перейти на классы [java.time] (http://docs.oracle.com/javase/9/docs/api/java/time/package-summary.html). См. [Учебное пособие по Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

1

ТЛ; дг

try { … java.time.LocalDate.parse(input) … } 
catch (java.time.format.DateTimeParseException e) { … } 

java.time

Joda-Time проект в настоящее время находится в maintenance mode, и команда советует перейти на классы java.time.

Класс LocalDate представляет собой значение, не имеющее времени суток и без часового пояса.

LocalDate ld = LocalDate.parse("2015-02-29") ; 

Для обнаружения недействительных входов, ловушек для DateTimeParseException.

String input = "2015-02-29"; 
try 
{ 
    LocalDate ld = LocalDate.parse(input); 
    System.out.println("ld.toString(): " + ld) ; 
} catch (DateTimeParseException e) 
{ 
    // … handle exception 
    System.out.println(e.getLocalizedMessage()); 
} 

Текст '2015-02-29' не может быть разобран: Invalid дата '29 февраля', как '2015' не является високосным


О java.time

Рамка java.time встроена в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.

Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.

Где получить классы java.time?

  • Java SE 8, Java SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ​​ThreeTen-Backport.
  • Android

ThreeTen-Extra Проект расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и more.

Смежные вопросы