关于java:f:如果时区由bean提供,则convertDateTime显示错误日期

f:convertDateTime displays wrong Date if timezone is provided by a bean

当将时区指定为字符串文字时,可以完美地工作:

1
2
3
<h:outputText value="#{item.dateChange}">
    <f:convertDateTime pattern="dd.MM.yyyy HH:mm" timeZone="Europe/Berlin"/>
</h:outputText>

bean提供的值不起作用(时间偏移1h到UTC,不应用夏令时1h)

1
2
3
<h:outputText value="#{item.dateChange}">
    <f:convertDateTime pattern="dd.MM.yyyy HH:mm" timeZone="#{item.platform.timeZone}"/>
</h:outputText>

我尝试了下面的两种方法,但都不起作用:

1
2
3
4
5
6
7
public TimeZone getTimeZone() {
    return TimeZone.getTimeZone("Europe/Berlin");
}

public String getTimeZone() {
    return"Europe/Berlin";
}

我需要为用户配置时区,如何实现这一点?

编辑:为了确保时区对象可用:

1
 <h:outputText value="#{item.platform.timeZone}"/>

SudieField[ID="欧洲/柏林",DeStayLo==3600000,dStule= Java.UTILUL.SimuleTyMeSt[ ID=欧洲/柏林,偏移量=3600000,dStayLe= true,StistyValue= 0,StistMood=2,StistalOnt= -1,StaseDayOfWee= 1,StestTime= 3600000,StimeTimeMod=2,EndoMe==2,EnthOng=dayOfWeek=1,endTime=3600000,endTimeMode=2]]

或者在第二次尝试中简单地说:"欧洲/柏林"。


正如Gimby指出的,一个类似的问题已经由Balusc回答了。

由于f:tags中的限制,需要自定义转换器。

有关该问题的详细描述和Balsuc的示例实现,请参阅:JSF ConvertDateTime,数据表中有时区

注意:这里提供的转换器期望bean返回一个描述时区而不是时区对象的字符串。