Как правильно заполнить <sj: datepicker timepicker = "true" >?

Я использую Struts2-jQuery Datepicker с помощью Timepicker Addon.

Предполагая, что объект java.util.Date возвращается в форме метода Action getMyDate() getter:

<sj:datepicker displayFormat="dd/mm/yy" 
            timepickerFormat="HH:mm"
                  timepicker="true" 
                        name="myDate" />

Это всегда приводит к правильной заполнению даты, но Timepicker всегда 00:00.

Ответ 1

Хорошо, я нашел время для расширения решения, которое я выяснил 18 декабря, и кратко упомянул в комментариях.

Проблема

Тег <sj:datepicker timepicker="true"> корректно анализирует объект Date, но не его строковое представление. Об этом сообщается в Issue 1057, при этом статус принят, но все еще не исправлен.

Этот работает:

<sj:datepicker displayFormat="dd/mm/yy" 
                  timepicker="true" 
                       value="%{new java.util.Date()}" />

Этот НЕ работает:

<sj:datepicker displayFormat="dd/mm/yy" 
                  timepicker="true" 
                       value="%{'07/01/2015 14:42'}" />

Если вы не используете конвертер, вам нужно отправить формат даты-времени в переменную String, а не в Date one:

<sj:datepicker displayFormat="dd/mm/yy" 
                  timepicker="true" 
                        name="dateStr" />
private String dateStr; 
public void setDateStr(String dateStr){
    this.dateStr = dateStr;
}
public String getDateStr(){
    return dateStr;
}

Если вам нужна дата (возможно, вы это делаете), вы можете использовать String Getter и Setter, который будет обрабатывать разбор и форматирование между Date и String:

private static final String FORMAT = "dd/MM/yyyy HH:mm";

private Date date; 
public void setDateStr(String dateStr){
    date = new SimpleDateFormat(FORMAT,Locale.ITALIAN).parse(dateStr);
}
public String getDateStr(){
    return new SimpleDateFormat(FORMAT,Locale.ITALIAN).format(date);
}

Но оба этих метода из-за ошибки, связанной выше, не будут работать. Решение так просто, что заставило меня рассмеяться в моем последнем комментарии к вопросу:

Решение

Используйте String setter и Date getter, тогда он будет работать отлично:

<sj:datepicker displayFormat="dd/mm/yy" 
                  timepicker="true" 
                        name="dateStr" 
                       value="date" />
private Date date; 
public void setDateStr(String dateStr){
    date = new SimpleDateFormat(FORMAT,Locale.ITALIAN).parse(dateStr);
}
public Date getDate(){
    return date;
}

(или напишите конвертер).

Боковое примечание: timepickerFormat="HH:mm" не требуется, потому что HH:mm (формат 24 часа) уже является стандартным форматом. Вам нужно изменить его только в том случае, если вам нужен формат отображения 12 часов.