jsp中Date字段的问题

时间:2015-04-02 17:56:50

标签: javascript jsp spring-mvc

我正在处理一些现有代码。有3个字段使用 JavaScript日期选择器并将其设置为bean的java.util.Date

我添加了一个名为reportPeriod(java.util.Date)的新字段。当我在调试器中读取此日期时,它的类型为"Thu Jul 31 00:00:00 EDT 2014"。在屏幕上执行保存时,bindingPreparation方法已完成。这里绑定了java.util.Date类型的所有字段。由于3个日期字段是由JavaScript设置的,因此它们都是"mm/dd/yyyy"形式。 bindingPreparation方法将这些日期作为字符串并尝试解析它们。它在报告期间失败。

我希望能够使用此字符串"Thu Jul 31 00:00:00 EDT 2014"并将其转换为格式mm/dd/yyyy的相应日期。我尝试使用SimpleDateFormat,但无法使用。

我的另一个选择是将其设为java.sql.Date,以便它不会通过绑定准备方法。但是,出现的问题是我将此报告期作为隐藏字段传递,并且我收到错误消息,指出无法将字符串转换为日期

这就是我隐藏字段的方式:我通过将reportPeriodDate添加到模型视图中来传递<input type="hidden" name="companyLot[${Index.index}].reportPeriodDate" value="${reportPeriodDate}"/>

    @InitBinder
   public void bindingPreparation(WebDataBinder binder){


    CompCustomDateEditor customDateEditor=new CompCustomDateEditor();
    binder.registerCustomEditor(java.util.Date.class, customDateEditor);

更新: Binding方法如下:

 public class CompCustomDateEditor extends PropertyEditorSupport {     
 public void setAsText(String text) throws IllegalArgumentException {

    if(!StringUtility.isNullOrEmpty(text))
    {

        StringTokenizer str=new StringTokenizer(StringUtility.trim(text),"/");
        StringBuffer dateString=new StringBuffer();


        while(str.hasMoreTokens())
        {
            dateString=dateString.append(str.nextToken());

        }
        StringBuffer dateStringNew=new StringBuffer();
        String tmp = dateString.substring(4,8).replace(",","");
        //dateStringNew=dateStringNew.append(dateString.substring(4,8));
        dateStringNew=dateStringNew.append(tmp);
                dateStringNew.append("-");
                dateStringNew.append(dateString.substring(0, 2));
                dateStringNew.append("-");
                String monthStr = dateString.substring(2, 4);
                //dateStringNew.append(dateString.substring(2, 4));
                dateStringNew.append(monthStr);
        SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");


        try {

            //java.util.Date customDate=dateFormat.parse(dateString.toString());
            java.util.Date customDate=dateFormat.parse(dateStringNew.toString());
            setValue(customDate);

        } catch (ParseException e) {

            e.printStackTrace();
        }
    }
}

此CompCustomDateEditor是由其他人编写的,他假设所有日期都是使用dd / mm / yyyy类型的日期选择器从javascript输入的。这个cutomDateEditor所做的就是将日期拆分为月份日期,然后使用格式yyyy-mm-dd创建日期。所以我的代码失败的原因是它尝试解析这个字符串&#34; Thu Jul 31 00:00:00 EDT 2014&#34;。因此,我想以某种方式使这个字符串到2014年7月31日。不知道怎么回事。

这是customDateEditor

{{1}}

2 个答案:

答案 0 :(得分:0)

您最好的选择是将模型中的 reportPeriodDate 设置为 bindingPrepartion 方法识别的字符串,SimpleDateFormat绝对适用于此,注意你应该使用大写的M,低级的是指分钟。因此,如果 reportPeriodDate 的类型为java.util.Date,请将其转换为适当的字符串并将其添加到模型中,例如

SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
String stringReportPeriodDate = dateFormat.format(reportPeriodDate)

如果甚至在控制器中是一个字符串,那么首先转换为Date而不是格式化为适当的格式,例如

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
Date reportPeriodDate =formatter.parse("Thu Jul 31 00:00:00 EDT 2014") 

或者如您在评论中所说,只需在自定义编辑器中添加if分支,例如

   if(text.length() >10){
     DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
     Date date=formatter.parse(text);
     setValue(date);
     return;
}

答案 1 :(得分:0)

  1. 使用隐藏输入字段时要小心,因为用户始终可以更改值

  2. 在POJO中的日期字段中使用@DateTimeFormat注释,并使用Spring的表单标记:

    public class Foo {
    
      @DateTimeFormat( ... )
      private Date reportPeriodDate;
    
      ...
    }
    

    <form:hidden path="..." />

  3. 使用ISO 8601日期/时间格式进行传输和存储(如果使用次数,则使用UTC时区进行存储)

  4. 如果可以

  5. ,请使用HTML5日期选择器
  6. 调试时看到的长日期时间字符串可能是在Date对象上调用toString()的结果,可能不是客户端发送到服务器的值