Nano Hash - криптовалюты, майнинг, программирование

JSF convertDateTime с часовым поясом в таблице данных

Попытка вывести список элементов в datatable, например:

<t:dataTable value="#{mybean.list}" var="item">
        <h:column>
            <h:outputText value="#{item.time}">
                <f:convertDateTime pattern="yyyy-MM-dd HH:mm:ssZ"  timeZone="#{item.timeZone}" />
            </h:outputText>
        </h:column>
</t:dataTable>

Он всегда форматирует время по Гринвичу. Это работает, как и ожидалось, если я использую строковую константу или bean-компонент, который не является переменной с данными (например, '#{mybean.timeZone}').

19.08.2011

Ответы:


1

К сожалению, такова природа тегов <f:xxx>. Когда представление должно быть построено, создается один экземпляр тега, в котором создается экземпляр преобразователя. Все его атрибуты считываются и устанавливаются только один раз. В момент создания представления #{item} преобразуется в null (он доступен только во время рендеринга представления), поэтому атрибут timeZone будет равен null, а затем по умолчанию будет использоваться значение UTC. Когда представление должно быть отображено, один и тот же экземпляр преобразователя повторно используется для каждой строки таблицы.

Есть несколько способов решить эту проблему. Я могу подумать о специальном преобразователе или функции EL. Я думаю, что пользовательский преобразователь, в конце концов, лучше всего, поскольку его также можно повторно использовать во входных компонентах. Следующий стартовый пример должен сработать для вас (для краткости проверочные значения и on опущены):

@FacesConverter("extendedDateTimeConverter")
public class ExtendedDateTimeConverter extends DateTimeConverter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        setPattern((String) component.getAttributes().get("pattern"));
        setTimeZone(TimeZone.getTimeZone((String) component.getAttributes().get("timeZone")));
        return super.getAsObject(context, component, value);
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        setPattern((String) component.getAttributes().get("pattern"));
        setTimeZone(TimeZone.getTimeZone((String) component.getAttributes().get("timeZone")));
        return super.getAsString(context, component, value);
    }

}

который можно использовать как

<h:outputText value="#{item.time}">
    <f:converter converterId="extendedDateTimeConverter" />
    <f:attribute name="pattern" value="yyyy-MM-dd HH:mm:ssZ" />
    <f:attribute name="timeZone" value="#{item.timeZone}" />
</h:outputText>

Таким образом, часовой пояс определяется каждый раз, когда вызывается преобразователь, а не во время его создания.


Обновление: OmniFaces <o:converter> решает именно эту проблему без необходимости пользовательский конвертер.

<h:outputText value="#{item.time}">
    <o:converter converterId="javax.faces.DateTime" pattern="yyyy-MM-dd HH:mm:ssZ" timeZone="#{item.timeZone}" />
</h:outputText>
19.08.2011
  • ConverterId все еще должен быть исправлен в конвертере omnifaces. Можно ли динамически установить convertId 26.02.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..