2014-02-03 3 views
0

привет, ребята, я использую этот метод, чтобы проверить, может ли строка быть преобразована в дату или нет, но кажется, что она не работает, это код, который я написал, пользователь вводит дату в этот формат дд/MM/YYYY, то это то, что происходит для проверки егоparse check не работает

... 
String date = JOptionPane.showInputDialog(frame,"Insert Date:"); 
    if (date ==null) { return;} 
    while (!(isValidDate(date))) {   
     JOptionPane.showMessageDialog(frame, "Incorrect Date"); 
     date = JOptionPane.showInputDialog(frame,"Insert Date:"); 
     if (date ==null) { return;} } 
    String[] parts = date.split("/"); 
    int year = Integer.parseInt(parts[2]); 
    int month = Integer.parseInt(parts[1]); 
    int day = Integer.parseInt(parts[0]); 
    ... 

и это метод для проверки даты

public boolean isValidDate(String dateString) { 
    SimpleDateFormat df = new SimpleDateFormat("dd/MM/YYYY"); 
    if (dateString.length() != "ddMMYYYY".length()) { 
     return false; } 
    try { 
     df.parse(dateString); 
     return true; 
    } catch (ParseException e) { 
     return false; 
    } 

это, кажется, не работает потому что она всегда идет в то время блокировать все, что я вставляю во вход, в чем проблема с этим кодом?

EDIT

исправлена ​​ошибка при условии

if (dateString.length() != "ddMMYYYY".length()) 

теперь я получил еще одну проблему, принимает значения, как 54/12/2030, которые obvioiusly являются не формат даты

+1

может быть '«дд/ММ/ГГГГ».Length()'? –

ответ

2

Ваше, если условие кажется неправильным ... Вот как это должно быть.

if (dateString.length() != "dd/MM/YYYY".length()) return false; 

если дата вход 22/07/1986, очевидно, его длина будет больше длины DDMMYYYY из-за недостающих слешами.

df.setLenient(false); Будет гарантировать, что он не перевернется в течение недействительных дат. Просто поставьте эту строку после создания объекта df.

+0

+1, но на самом деле вам не понадобится это условие, верно? –

+0

теперь работает для части, но теперь он принимает такие значения, как 54/20/2013 –

+0

@tobias_k, конечно, я бы тоже не писал это условие, я просто указываю на проблему. – Buddha

0

Во-первых, вы хотите, чтобы ваша дата была разделена / в большинстве мест, но вы проверяете, имеет ли строка длина такой же длины, как "ddMMYYYY". Вы, вероятно, следует изменить метод isValidDate() включить косую черту (и завершающую крупным скобку):

public boolean isValidDate(String dateString) { 
    SimpleDateFormat df = new SimpleDateFormat("dd/MM/YYYY"); 
    if (dateString.length() != "dd/MM/YYYY".length()) { 
     return false; 
    } 
    try { 
     df.parse(dateString); 
     return true; 
    } catch (ParseException e) { 
     return false; 
    } 
} 
+0

исправил эту ошибку, но теперь он принимает значения, такие как 54/12/3013, как хорошие даты. –

+0

Технически это допустимая дата в режиме мягкости. Вы можете попробовать 'df.setLenient (false)'. –

+0

вставил эту проблему, но все же та же проблема –

1

Это очень хорошая причина, почему вы должны использовать статический окончательный определить, а не повторять ту же строку по всей вашей код. Вы сравниваете одну строку с синтаксическим анализом против другого, поэтому оба никогда не будут совпадать.

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

Просто переименуйте isValidDate в parseDate, верните объект Date или null, если он недействителен, и продолжите цикл while, пока возвращаемая дата не будет равна null.

+0

, потому что мой конструктор классов принимает ints соответственно для создания новой даты с этими ints в качестве полей. В моем первом attemp мой конструктор взял дату, но с датой напрямую заставлял меня хранить неправильную дату, вызванную износ, потому что я не могу югу от 1900 года и от 1 до месяца –

0

для последней задачи я уже со ссылкой на значения, как 54/77/4444 я изменил гггг гггг, и она работала

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