2014-03-10 6 views
4

Когда я ввожу 00/00/0000 в фильтр диапазона дат (до и с даты) на веб-странице, он сохраняется как 11/30/0002.Значение даты: при вводе 00/00/0000 сохраняет как 11/30/0002

Я пытаюсь использовать setLenient(false), но не повезло. Вот часть кода. Надеюсь, поможет. Я включаю код веб-страницы, который принимает значения и код из бэк-компонента.

XHTML код страницы:

<h:panelGroup layout="block" styleClass="myWorkDate"> 
       <h:commandLink action="#{myFollowupBean.startRangeFilter}" id="lnkDateRange" value="#{myFollowupBean.rangeFilter.display}" /> 
      </h:panelGroup> 

MyFollowUpBean.java: Bean файл

код в бэк-боба. Диалоговое окно появится для фильтра диапазона дат. Когда я вхожу в нуль, это экономит 11/30/0002 и обрабатывает запрос вместо выдачи ошибки RangeFilterVO - класс модели для дат

public void startRangeFilter() { 
        Command saveCommand = new Command() { 

         @Override 
         public String execute(Object returnObject) { 
          RangeFilterVO vo = (RangeFilterVO)returnObject; 
          rangeFilter.setFromDate(vo.getFromDate()); 
          rangeFilter.setToDate(vo.getToDate()); 
          searchAll(); 
          fetch(); 

          return null; 
         } 
        }; 

        CalendarRangeFilterDialog dialog = new CalendarRangeFilterDialog(); 

        dialog.setWidth(300); 
        try { 
         RangeFilterVO param = (RangeFilterVO) BeanUtils 
           .cloneBean(rangeFilter); 
         dialog.setVo(param); 

        } catch (IllegalAccessException | InstantiationException 
          | InvocationTargetException | NoSuchMethodException e) { 
        } 
        DialogFrame.displayDialog(dialog, saveCommand); 

       } 


    DateTimeConverter.java: 

public static String getDatePattern(){ 
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT,  FacesUtils.getLocale()); 
String datePattern = ((SimpleDateFormat) dateFormat).toPattern(); 
Date myDate; 
try { 
    if(myDate == dateFormat.parse(datePattern)){ 
     if (datePattern.indexOf("MM") == -1){ 
      datePattern = StringUtils.replace(datePattern, "M", "MM"); 
     } 
     if (datePattern.indexOf("dd") == -1){ 
      datePattern = StringUtils.replace(datePattern, "d", "dd"); 
     } 
     if (datePattern.indexOf("yyyy") == -1){ 
      datePattern = StringUtils.replace(datePattern, "yy", "yyyy"); 
     } 
    } 
} catch (ParseException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

return datePattern; 
} 

Может кто-нибудь, пожалуйста, объясните мне больше об этом?

+1

Покажите нам свой код. – SJuan76

+1

В качестве побочного примечания, вы отфильтровываете даты до того, что это настоящая проблема? :) –

+2

вы понимаете, что 00/00/0000 на самом деле не дата, не так ли? – njzk2

ответ

4

Это артефакт для размещения нулей в полях, которые основаны на одном. Он автоматически корректирует до конца предыдущего блока.

Итак, год 0000 = 0 AD/CE = 1 BC/BCE.

«Месяц 0» года 1 BCE становится последним месяцем прошлого года: 2 декабря до нашей эры.

Аналогично, «День 0» декабря будет последний день предыдущего месяца: 30 ноября

Следовательно, 00/00/0000 корректируется до 30 ноября 2 до н. В вашем формате нет поля для эры, поэтому ваш дисплей теряет тот факт, что это год BCE.

Если вы предпочитаете отклонять значения парсера за пределами их нормального диапазона, просто позвоните dateFormat.setLenient(false) перед вызовом dateFormat.parse(); имейте в виду, что синтаксический анализатор будет затем возбуждать исключение, когда даются такие даты.

+0

Получить сообщение об ошибке при вводе неверной даты. – user2988851

+0

@ user2988851 Просто используйте 'setLenient (false)' on 'SimpleDateFormat', в противном случае очень приятное объяснение –

+0

Я делаю это. – user2988851