2016-11-16 37 views
-3

這是我的第一篇文章,關於一個多星期沒有有用答案的問題。我有一個表格(JSP)與Hibernate和Spring在日期選擇器,這裏是 「形式」 標籤:Java SimpleDateFormat無法正常工作

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
<%@ taglib prefix="tag" uri="/WEB-INF/taglibs/customTaglib.tld"%> 
Private Code with Head, Meta, and opening tags 
<form:form method="POST" action="${pageContext.request.contextPath}/save.htm" 
          modelAttribute="formName"> 
          <div class="row"> 
           <!-- /.col-lg-4 (nested) --> 
           <div class="col-lg-4 col-sm-4 col-xs-12"> 

            <div class="form-group"> 
             <label>Starting Date: </label> 
             <form:input type="text" class="form-control" 
              id="agregar_fechainicio" path="agregar_fechainicio" maxlength="10" onkeypress="return event.charCode >= 48 && event.charCode <=57" /> 
            </div> 
            <div class="form-group"> 
             <label>Ending Date: </label> 
             <form:input type="text" class="form-control" 
              id="agregar_fechatermino" path="agregar_fechatermino" maxlength="10" onkeypress="return event.charCode >= 48 && event.charCode <=57" /> 
            </div> 
           </div> 
           <!-- /.col-lg-4 (nested) --> 
          </div> 

          <!-- /.row (nested) --> 
          <div class="row"> 
           <div class="col-lg-4 col-sm-offset-8"> 
            <input type="submit" class="btn btn-default" 
             value="Save" /> <input type="reset" class="btn" 
             value="Reset" /> 
           </div> 
          </div> 
         </form:form> 
         <!-- /.row --> 
        </div> 
        <!-- /.panel-body --> 
       </div> 
       <!-- /.panel --> 
      </div> 

      <!-- /.col-lg-12 --> 


     </div> 
     <!-- /.row --> 

    </div> 
    <!-- /#page-wrapper --> 

</div> 
<!-- /#wrapper --> 

Private Code with others scripts 
<script 
    src="${pageContext.request.contextPath}/resources/js/jquery-ui.js"></script> 
<link rel="stylesheet" 
    href="${pageContext.request.contextPath}/resources/cs/jquery-ui.css"> 
</script> 
<script> 
    $(function() { 
     $.datepicker.setDefaults($.datepicker.regional["es"]); 
     $("#agregar_fechainicio").datepicker({ 
      buttonImage : '${contextPath}/resources/images/calendar2.png', 
      buttonImageOnly : true, 
      showButtonPanel : false, 
      minDate : "0D", 
      defaultDate : "+1d", 
      changeMonth : true, 
      changeYear : true, 
      numberOfMonths : 1, 
      fixFocusIE : false, 
      onSelect : function(selectedDate) { 
       $("#to").datepicker("option", "minDate", selectedDate); 
      } 
     }); 
    }); 
    $(function() { 
     $.datepicker.setDefaults($.datepicker.regional["es"]); 
     $("#agregar_fechatermino").datepicker({ 
      buttonImage : '${contextPath}/resources/images/calendar2.png', 
      buttonImageOnly : true, 
      showButtonPanel : false, 
      minDate : "1D", 
      defaultDate : "+1d", 
      changeMonth : true, 
      changeYear : true, 
      numberOfMonths : 1, 
      fixFocusIE : false, 
      onSelect : function(selectedDate) { 
       $("#to").datepicker("option", "minDate", selectedDate); 
      } 
     }); 
    }); 
</script> 

現在,控制器具有的方法:

@RequestMapping(value = "/save.htm", method = RequestMethod.POST) 
public ModelAndView saveController(
     @ModelAttribute("formName") FormName formName, 
     Integer offset, BindingResult bindingResult, ModelMap model, 
     Integer maxResults) { 
    try { 
     int var = 0; 
     model.addAttribute("offset", offset); 
     model.addAttribute("maxResults", maxResults); 
      // Bloque save 
      int retorno = service.add(formName); 
        *PRIVATE CODE NOT RELATIONED WITH METHOD* 
       field = message.cargaSucess(); 
       msg = alerts.sucessForms(field); 
       model.addAttribute("error", ""); 
       model.addAttribute("warning", ""); 
       // send message over success 
       model.addAttribute("success", msg); 
       formName = new FormName(); 

      model.remove(formName); 
      model.addAttribute("formName", 
        new FormName()); 
    } catch (Exception e) { 
     logger.error("Error in method saveController <[" 
       + e.getMessage() + "]>"); 
     field = mensajes.cargaPagError(); 
     msg = alerts.errorCargaForms(field); 
     model.addAttribute("error", msg); 
     model.addAttribute("warning", ""); 
     model.addAttribute("success", ""); 
     return new ModelAndView("home/dates", "model", 
       model); 
    } 
    return new ModelAndView("home/dates", "model", model); 
} 

我在其他課程中有以下幾點(要檢查日期是否正確):

public String validation(
     FormNew formNew) 
     throws ParseException { 
    String fields = ""; 
    DateFormat format = new SimpleDateFormat("dd/MM/yyyy"); 

    if (format.parse(formNew.getAgregar_fechainicio()) 
      .compareTo(
        format.parse(formNew 
          .getAgregar_fechatermino())) >= 1) { 
     fields = fields 
       .concat("Ending date cant be newer than starting date. <br>"); 
    } 
    if (format.parse(formNew.getAgregar_fechainicio()) 
      .compareTo(
        format.parse(formNew 
          .getAgregar_fechatermino())) == 0) { 
     fields = fields 
       .concat("Starting and Edning date are same. <br>"); 
    } 
} 

(有一些代碼,不受版權表明)

服務類:

@Autowired 
TABLE_DATEDAO tABLE_DATEDAO; 

@Override 
public int add(NewForm newForm) { 
    TABLE_DATE tABLE_DATE = new TABLE_DATE(); 
    // System.out.println("FORMATO FECHA +newForm.getAgregar_fechainicio()); 
    try { 

      DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
      tABLE_DATE.setFechainicio(dateFormat 
        .parse(newForm 
          .getAgregar_fechainicio())); // * 
      tABLE_DATE.setFechatermino(dateFormat 
        .parse(newForm 
          .getAgregar_fechatermino())); // * 
      total = dateFormat.parse(
        newForm.getAgregar_fechainicio()) 
        .compareTo(
          dateFormat.parse(newForm 
            .getAgregar_fechatermino())); 
      Date date = new Date(); 
      tABLE_DATE.setFechacreacion(dateFormat.parse(dateFormat 
        .format(date))); 
      // System.out.println("FORMATO FECHA "+dateFormat.parse(dateFormat.format(date))); 


    } catch (Exception e) { 
     e.printStackTrace(); 
     System.out.println("Wrong at date service method: "+e.getMessage()); 
    } 

    return tABLE_DATEDAO.add(tABLE_DATE); 
} 

和最後一個方法:

public int comparaFecha(String fechaInit, String fechaFin) { 
    int salida = -2; 
    try { 
     logger.info("FECHA INICIO: "+fechaInit); 
     String pattern = "dd-MM-yyyy"; 
     SimpleDateFormat format = new SimpleDateFormat(pattern); 
     logger.info("salida = dat2.compareTo(dat1);"+fechaFin.compareTo(fechaInit)); 
     Date dat1 = format.parse(fechaInit); 
     logger.info("Fecha INicio Formateada: "+dat1); 
     Date dat2 = format.parse(fechaFin); 
     salida = dat2.compareTo(dat1); 
     //salida = fechaFin.compareTo(fechaInit); 

    } catch (Exception e) { 
     logger.error("Error al comparar la fecha metodo utils " 
       + e.getMessage()); 
     e.printStackTrace(); 
    } 
    return salida; 
} 

好了,現在,這裏是我的問題:

當我選擇日期時,例如:03/26/2018作爲開始日期和03/28/2020作爲結束日期,當我保存並單擊編輯它時,它顯示我03/02/2020作爲開始日期和03/02/2022作爲結束日期,當我Sout(Syso)我從窗體得到的日期,是這種格式:03/26/2018 當我解析它時,模式:「 dd/MM/yyyy「它給了我一個結果:」MMM dd,yyyy hh:mm:ss a「

然後它將日期更改爲大約6個月以上,從原始日期到約2最多年。

任何幫助?

+3

'3月28日/ 2020'好像'MM/DD/yyyy',但你用「dd/MM/yyyy」解析它? 28和26肯定不是月份數字。 – RealSkeptic

+0

如果遇到問題,最好生成[mvce]而不是轉儲100行不相關的代碼。 – assylias

回答

0

您使用一月份的第二個參數(西班牙語日期格式)的模式:

String pattern = "dd-MM-yyyy"; 

您需要使用月/日:

String pattern = "MM-dd-yyyy"; 

OR

用正確的格式插入日期:

26/03/2018 as starting date and 
28/03/2020 as ending date 

OR

使用Dateformat::setLenient()使解析器嚴格然後拋出一個異常