У меня свидание, которое постоянно дает мне ошибку

java.text.ParseException: Unparseable date: " 5 April 2017  "

Все остальные даты (без слов месяцев) работают нормально

Код, который я использую ниже:

VisitDate=VisitDate.trim();
if (VisitDate.matches(".*[a-z].*")){
    SimpleDateFormat changeDate = new SimpleDateFormat("dd_MMM_yy", Locale.UK);
    //Convert the string to a date
    Date date = changeDate.parse(VisitDate);
    //Reformat the date the way I like it
    SimpleDateFormat dt1 = new SimpleDateFormat("dd_MM_yy");

    //Convert back into a string
    try {
        VisitDate=dt1.format(date);
        if(VisitDate==null){
            SimpleDateFormat dt2 = new SimpleDateFormat("dd MM yy");
            //Convert back into a string
            VisitDate=dt2.format(date);
            if(VisitDate==null){
                SimpleDateFormat dt3 = new SimpleDateFormat("dd MMMM yy");
                //Convert back into a string
                VisitDate=dt3.format(date);
                if(VisitDate==null){
                    SimpleDateFormat dt4 = new SimpleDateFormat("d_MMM_yy");
                    //Convert back into a string
                    VisitDate=dt4.format(date);
                    if(VisitDate==null){
                        SimpleDateFormat dt5 = new SimpleDateFormat("d_MMMM_yy");
                        //Convert back into a string
                        VisitDate=dt5.format(date);
                        if(VisitDate==null){
                            SimpleDateFormat dt6 = new SimpleDateFormat("dd_MMM_yy");
                            //Convert back into a string
                            VisitDate=dt6.format(date);
                            if(VisitDate==null){
                                SimpleDateFormat dt7 = new SimpleDateFormat("dd_MMM_yyyy");
                                //Convert back into a string
                                VisitDate=dt7.format(date);
                                if(VisitDate==null){
                                    SimpleDateFormat dt8 = new SimpleDateFormat("dd_MMMM_yyyy");
                                    //Convert back into a string
                                    VisitDate=dt8.format(date);
                                    if(VisitDate==null){
                                        VisitDate=VisitDate.replaceAll("\\s", "");

                                        SimpleDateFormat dt9 = new SimpleDateFormat("dd MMMM yyyy");
                                        //Convert back into a string
                                        VisitDate=dt9.format(date);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    } catch (Exception e) {
        Logger.error(e+"->No visit Date frmo here with the original date as: "+date);
    }
}
0
Sebastian Zeki 29 Май 2017 в 00:06

2 ответа

Лучший ответ

Рад узнать, что вы проявили интерес к современным урокам даты и времени, вот лишь небольшой фрагмент для начала:

    String visitDate = " 5 April 2017  ";
    DateTimeFormatter parseFormatter 
            = DateTimeFormatter.ofPattern("d MMMM uuuu", Locale.UK);
    visitDate = visitDate.trim();
    LocalDate date = LocalDate.parse(visitDate, parseFormatter);
    // reformat to the string we like
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd_MM_uu");
    visitDate = date.format(formatter);

Результат

05_04_17

Я написал visitDate с небольшим v, так как соглашения Java по кодированию рекомендуют, чтобы имена переменных начинались с маленькой буквы.

uu тонкий и, вероятно, то, что вы можете игнорировать. Это подписанный год, где 0 равно 1 г. до н.э., -1 равно 2 г. до н.э. и так далее. Предполагая, что ни одна из ваших дат не является такой старой, вы можете использовать u и y взаимозаменяемо.

Я считаю, что ни SimpleDateFormat.format(), ни LocalDate.format() никогда не вернут ноль, поэтому все ваши нулевые проверки являются излишними.

Ссылка для дальнейшего чтения: Обучающее руководство по Oracle: Trail: Date Time

3
Ole V.V. 29 Май 2017 в 19:35

У вас есть только один SimpleDateFormat, используемый для разбора:

SimpleDateFormat changeDate = new SimpleDateFormat("dd_MMM_yy", Locale.UK);
//Convert the string to a date
Date date = changeDate.parse(VisitDate);

Он использует формат dd_MMM_yy, однако вы передаете 4 цифры за год.

Остальные ваши SimpleDateFormatters используются для форматирования в строку, а не в синтаксическом анализе строки. Будет вызван только первый, так как он сможет создать строку с заданной датой, и следующие проверки на нуль остановят использование любых других форматеров.

0
Jason 29 Май 2017 в 21:57