Дата разбора неверно - PullRequest
2 голосов
/ 26 марта 2012

Я пытаюсь преобразовать введенную строку даты в формат даты, а затем в формат даты и времени.В качестве теста я указал неверный формат даты, но, похоже, это не вызывает каких-либо исключений при разборе и дает неправильный вывод.Любые мысли о том, что мой код ниже делает неправильно?

            String OLD_FORMAT ="MM/dd/yyyy";
            String NEW_FORMAT ="yyyyMMdd HHmmss";
            SimpleDateFormat sdf = new SimpleDateFormat(OLD_FORMAT);
            String oldDateString = "03/01211/2012"; //Incorrect input
            Date myOldDate;
            Datetime myNewDate;
            try {
                myOldoldDate = sdf.parse(oldDateString); 
           //Returns Wed Jun 24 00:00:00 IST 2015...why?? 
          //Shouldn't this be throwing a parse exception?
            } catch (ParseException e) {
                logger.error("Error while parsing Date");
            }
            sdf.applyPattern(NEW_FORMAT);
            //Converting date to datetime format
            try {
                myNewDate= DateHelper.toDatetime(sdf.parse((sdf.format(myOldDate)))); 
           //Returns 2015-06-24 00:00:00.0
            } catch (ParseException e) {
                logger.error("Error while parsing Date");
            }

Ответы [ 3 ]

4 голосов
/ 26 марта 2012

"03/01211/2012" => 24 июня 00:00:00 IST 2015 ... почему?

Я предполагаю, что 24 июня 2015 года - 1211 дней с 1 марта 2012 года. Чрезмерное переворачивание, читается как 1211 марта.

Вы должны быть в состоянии отключить это с помощью:

sdf.setLenient(false)

public void setLenient (логическое значение)

Укажите, будет ли интерпретация даты / времени снисходительной. При мягком толковании дата, такая как «942 февраля 1996 года», будет считаться эквивалентной 941-му дню после 1 февраля 1996 года. При строгом толковании такие даты вызовут исключение.

1 голос
/ 26 марта 2012

Не глядя на исходный код, я предполагаю, что 01211 анализируется до 1211 дней, которые добавляются к 2012-03-01, что приводит к 2015-06-24.Как сказал @Thilo, sdf.setLenient(false) здесь должно помочь.

Проблема в том, что по умолчанию синтаксический анализатор более терпим к ошибочному вводу (по умолчанию включен снисходительный режим) и, таким образом, не выдает здесь исключение.

1 голос
/ 26 марта 2012

Вы можете установить строгий формат

SimpleDateFormat.setLenient (false)

Укажите, будет ли анализ даты / времени снисходительным.При мягком анализе синтаксический анализатор может использовать эвристику для интерпретации входных данных, которые точно не соответствуют формату этого объекта.При строгом разборе входные данные должны соответствовать формату этого объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...