4

我正在为我的日期输入使用以下 JSF 转换器。

<f:convertDateTime dateStyle="medium" timeZone="EST" type="date" />

我想集中转换器,以便我可以在一个地方更改时区或日期样式。这怎么可能?

我可以覆盖<f:convertDateTime>吗?

4

1 回答 1

10

唯一的方法是依赖系统默认时区(而不是 JSF 内部使用的 UTC)。因此,如果您对生产运行时环境有 100% 的控制权并且生产系统平台时区是 EST,那么只需将以下上下文参数添加到web.xml

<context-param>
    <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
    <param-value>true</param-value>
</context-param>

这样,JSF 将使用系统平台时区TimeZone#getDefault()作为转换器的默认时区而不是 UTC。

如果您无法控制它,那么最好的办法是创建一个应用程序范围的 bean 来保存该属性并引用它:

<f:convertDateTime ... timeZone="#{app.timeZone}" />

可以按如下方式扩展DateTimeConverter后面的类,以获得已设置所有属性的转换器,但是如果不将其包装在自定义标记中(这需要一个和一些 XML 样板<f:convertDateTime>),您将无法从视图端声明其他属性TagHandler):

@FacesConverter("defaultDateConverter")
public class DefaultDateConverter extends DateTimeConverter {

    public DefaultDateConverter() {
        setDateStyle("medium");
        setType("date");
        setTimeZone(TimeZone.getTimeZone("EST"));
    }

}

用它作为<f:converter converterId="defaultDateConverter" />

于 2012-12-21T15:47:05.537 回答