Struts 2 JQuery Datepicker问题

时间:2014-07-10 03:11:59

标签: javascript jquery date struts2 datepicker

我使用Struts 2 Jquery Date选择器来选择日期。

如下所示

 <sj:datepicker name="testDate" 
              parentTheme="simple"
              zindex="2006"
              timepicker="true"
              changeYear="true"
              displayFormat="dd/mm/yy"
              timepickerFormat="HH:mm:ss"
              timepickerShowSecond="true"
              duration="fast"
              readonly="true"   
          ></sj:datepicker>

如果您看到我提到的格式为dd/mm/yy且时间格式为HH:mm:ss,那么当用户选择日期时,此处一切正常..

当用户选择我获取日期的日期时我的Action类中的预期格式。但是当我在完成操作后重定向到同一页面时,我的日期选择器文本字段被设置为错误的格式,如mm/dd/yyy ..我希望我的日期datepickers格式设置为我在{{I}中提到的日期格式{1}}标记。

由于这个用户变得困惑,任何人都可以告诉我如何设置相同的格式,即使在操作完成后用户在操作之前选择的格式

我正在使用datepicker

2 个答案:

答案 0 :(得分:3)

问题是因为根据dd/mm/yystruts2 jquery 不是有效格式

有效格式为dd.mm.yydd-mm-yy

根据此链接的有效格式为:Click here

  

DD.MM.YY
  MM / DD / YY
  DD,d MM yy
  d M,yy
  DD-MM-YY

他们说

  

displayFormat - &gt;用于视觉显示格式化日期的模式,例如, YY-    mm-dd,dd.mm.yy

但模式dd/mm/yy不起作用。他们也没有在/ 对displayFormat 的描述中指定dd/mm/yy(Slash)。他们只指定了.(点)和-(短划线)。

我也试过dd//mm//yy正在运作!!!

但不使用dd/mm/yy :(

<强>原因:

datepicker无法解析字符串值dd/mm/yy。它将dd/mm/yy视为mm/dd/yy

对于某些值,它失败了,它将日期和月份之间的最大值视为两者都小于12的日期。

例如:

  

输入: 02/07/2014 09:30:41

     

displayFormat: dd / mm / yy

     

实际日期: 2
  实际月份: 7
  实际时间: 09:30:41

     

Parsedday: 7
   Parsedmonth: 2
   Parsedtime::00:00:00

     

输出:07/02/2014 00:00:00

这是一个开放但仍未解决的问题。 Struts2 Jquery团队 接受,这是一个问题。此问题的状态已被接受。

以下是问题链接

Issue 1057 in struts2-jquery: datepicker can't parse a string value with a time component

<强>解决方案

我建议你使用

  

displayFormat = “DD-MM-YY”

解决您的问题或等待issue 1057解决。

根据我的研究,以下功能需要使用alert(err)进行调试;

解析的实际功能

//#######################################################################################
// Splits datetime string into date ans time substrings.
// Throws exception when date can't be parsed
// If only date is present, time substring eill be ''
//#######################################################################################
var splitDateTime = function(dateFormat, dateTimeString, dateSettings)
{
    try {
            var date = $.datepicker._base_parseDate(dateFormat, dateTimeString, dateSettings);
    } catch (err) {
            if (err.indexOf(":") >= 0) {
                    // Hack!  The error message ends with a colon, a space, and
                    // the "extra" characters.  We rely on that instead of
                    // attempting to perfectly reproduce the parsing algorithm.
        var dateStringLength = dateTimeString.length-(err.length-err.indexOf(':')-2);
        var timeString = dateTimeString.substring(dateStringLength);

        return [dateTimeString.substring(0, dateStringLength), dateTimeString.substring(dateStringLength)];

            } else {
                    throw err;
            }
    }
    return [dateTimeString, ''];
 };

源代码链接第1447行jquery-ui-timepicker-addon.js

 //#######################################################################################
 // override parseDate() because UI 1.8.14 throws an error about "Extra characters"
 // An option in datapicker to ignore extra format characters would be nicer.
 //#######################################################################################
 $.datepicker._base_parseDate = $.datepicker.parseDate;
 $.datepicker.parseDate = function(format, value, settings) {
var splitRes = splitDateTime(format, value, settings);
    return $.datepicker._base_parseDate(format, splitRes[0], settings);
 };

源代码链接:第1340行jquery-ui-timepicker-addon.js

答案 1 :(得分:0)

我认为通过使用Java Date(而不是String)设置Datepicker的值你应该没问题:

<sj:datepicker name="testDate" 
               value="%{testDateValue}"
               ...
 ></sj:datepicker>

并在动作类中:

public Date getTestDateValue()
{
    try {
        return new SimpleDateFormat("dd/MM/yy HH:mm:ss").parse(getTestDate());
    } catch (ParseException e) {
        return null;
    }
}