【问题标题】:Java SimpleDateFormat Not working properlyJava SimpleDateFormat 无法正常工作
【发布时间】:2017-03-30 17:04:02
【问题描述】:

这是我的第一篇文章,是关于一个让我一个多星期没有有用答案的问题。我在带有休眠和弹簧的表单(JSP)上有一个日期选择器,这里是“表单”标签:

<%@ 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 年。

有什么帮助吗?

【问题讨论】:

  • 03/28/2020 看起来像MM/dd/yyyy,但你用dd/MM/yyyy 解析它? 28 和 26 肯定不是月份数字。
  • 当你遇到问题时,最好生成一个 [mvce] 而不是转储 100 行不相关的代码。

标签: java spring hibernate date datetime


【解决方案1】:

您使用月份是第二个参数的模式(西班牙日期格式):

String pattern = "dd-MM-yyyy";

您需要使用月/日:

String pattern = "MM-dd-yyyy";

以正确的格式插入您的日期:

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

使用Dateformat::setLenient() 使解析器严格然后引发异常

【讨论】:

    猜你喜欢
    • 2011-07-04
    • 2017-02-17
    • 2015-02-20
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    相关资源
    最近更新 更多