2

例子:

<h:form>
    <h:selectOneMenu value="#{bean.timezone}>
        <f:selectItems value="#{bean.availableTimezones} ... >
        <f:ajax render="currenttime" />
    </h:selectOneMenu>
</h:form>

<h:form id="currenttime">
    <h:outputText value="#{bean.currentTime}" >
        <f:convertDateTime dateStyle="short" type="both" timeZone="#{bean.timezone}" />
    </h:outputText>
</h:form>

<!-- bean.currentTime is of type 'Date' -->

在示例中,更改时区应导致文本currenttime显示在正确的时区中。但事实并非如此。

我认为发生这种情况是因为转换器是在“应用请求”阶段计算的,并且所选时区的值是在“更新模型”阶段更新的。

我对吗?我不应该为此使用转换器吗?

谢谢!

4

1 回答 1

6

您的具体问题是因为<f:convertDateTime>在视图构建期间初始化而不是在视图渲染期间初始化(就像 JSTL 等)。实际上,这在更新模型值阶段之前运行很长时间,因此在视图渲染期间转换器不会使用用户提交的时区进行设置。

这个问题与以下答案中的回答基本相同:

其中一种方法是将转换器实例作为 bean 属性进行管理和绑定。

private DateTimeConverter converter;

@PostConstruct
public void init() {
    converter = new DateTimeConverter();
    converter.setDateStyle("short");
    converter.setType("both");
}

public DateTimeConverter getDateTimeConverter() {
    converter.setTimeZone(timezone);
    return converter;
}

<h:outputText value="#{bean.currentTime}" >
    <f:converter binding="#{bean.dateTimeConverter}" />
</h:outputText>

另一种方法是使用支持转换器属性的渲染时评估的OmniFaces :<o:converter

<h:outputText value="#{bean.currentTime}" >
    <o:converter converterId="javax.faces.DateTime" dateStyle="short" type="both" timeZone="#{bean.timezone}" />
</h:outputText>
于 2013-01-21T16:06:58.410 回答