我正在为我的日期输入使用以下 JSF 转换器。
<f:convertDateTime dateStyle="medium" timeZone="EST" type="date" />
我想集中转换器,以便我可以在一个地方更改时区或日期样式。这怎么可能?
我可以覆盖<f:convertDateTime>
吗?
唯一的方法是依赖系统默认时区(而不是 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" />