Подтвердить что ты не робот

JSF convertDateTime отображает предыдущий день

Дата (как временный тип даты) сохраняется в моей БД следующим образом: 31.10.2012
Когда я показываю его в пользовательском интерфейсе, он отображается как по умолчанию: 2012-10-31
Я конвертирую его с помощью <f:convertDateTime pattern="dd.MM.yyyy" /> и неожиданно превращается в 30.10.2012

SimpleDateconverter, с той же датой и той же строкой формата возвращает 31.10.2012, как и ожидалось.

Что мне не хватает?

Спасибо

EDIT: для дат, сохраненных как Timestamp, одно и то же преобразование дает правильные результаты, поэтому я полагаю, что это имеет какое-то отношение к Date, интерпретируемому как точная полуночи, которая, в свою очередь, может быть истолкована как принадлежащая двум различным дням. Но я до сих пор не знаю, где определить поведение и что будет лучшим обходным решением.

4b9b3361

Ответ 1

Это, несомненно, проблема, связанная с часовым поясом.

JSF по умолчанию использует GMT (UTC) для преобразования даты/времени. Поэтому, если часовой пояс вашей серверной платформы по умолчанию - GMT + X (не GMT-X), тогда время вернется в прошлое X-количество часов. Если время уже 00:00:00 (полночь), то дата даже вернется в один прекрасный день в прошлом.

Есть два стандартных способа достижения вашего функционального требования:

  • Сообщите JSF использовать часовую зону по умолчанию для платформы сервера для всего преобразования даты и времени, добавив следующий параметр контекста в web.xml:

    <context-param>
        <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
        <param-value>true</param-value>
    </context-param>
    
  • Измените каждый <f:convertDateTime>, чтобы явно указать часовой пояс, специфичный для webapp. Поскольку вы находитесь в Германии, и шаблон формата даты также подтверждает это, я буду считать CET.

    <f:convertDateTime ... timeZone="CET" />
    

В любом случае использование не универсального или даже смешанного часового пояса во всем приложении не рекомендуется. Рекомендуется устанавливать часовой пояс во всех слоях и средах для UTC. Не только на уровне сервера и переднего уровня и уровня представления, но также и в базе данных SQL, а также на уровне верхнего уровня и настойчивости. Таким образом, код не чувствителен к вопросам, связанным с часовым поясом и DST (!), И вы можете просто сосредоточиться на изменении часового пояса только во время презентации, если это необходимо.

См. также: