日期值:输入时00/00/0000保存为11/30/0002

use*_*851 8 validation date java.util.date

当我在网页中的日期范围过滤器(来回日期)中输入00/00/0000时,它将保存为11/30/0002.

我想用setLenient(false)但没有运气.这是代码的一部分.希望能帮助到你.我包含了网页代码,它接受来自支持bean的值和代码.

XHTML页面代码:

<h:panelGroup layout="block" styleClass="myWorkDate">
                <h:commandLink action="#{myFollowupBean.startRangeFilter}" id="lnkDateRange" value="#{myFollowupBean.rangeFilter.display}" />
            </h:panelGroup>
Run Code Online (Sandbox Code Playgroud)

MyFollowUpBean.java:Bean文件

支持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;
}
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释一下这个吗?

Mar*_*eed 8

这是将零放入基于1的字段中的产物。它会自动校正到上一个单元的末尾。

在通常的时代,传统上不存在“ 0年”。1 AD / CE之前的年份是1 BC / BCE。因此,您输入的年0000变为1 BCE。

然后,公元前1年的“第0个月”成为上一年的最后一个月:公元前12月12日。

同样,12月的“第0天”成为上个月的最后一天:11月30日。

因此,00/00/0000被更正为公元前2年11月30日。您的格式没有该时代的字段,因此您的显示内容丢失了事实,即结果为“ 11/30/0002”是BCE年。

如果您希望解析器拒绝超出其正常范围的值,则只需在调用dateFormat.setLenient(false)之前先调用dateFormat.parse();建议解析器在给定此类日期时将引发异常。