如果 bean 提供时区,f:convertDateTime 将显示错误的日期
Posted
技术标签:
【中文标题】如果 bean 提供时区,f:convertDateTime 将显示错误的日期【英文标题】:f:convertDateTime displays wrong Date if timezone is provided by a bean 【发布时间】:2014-06-27 07:53:13 【问题描述】:虽然将时区指定为字符串文字可以完美地工作:
<h:outputText value="#item.dateChange">
<f:convertDateTime pattern="dd.MM.yyyy HH:mm" timeZone="Europe/Berlin"/>
</h:outputText>
通过 bean 提供值不起作用(时间偏移 1h 到 UTC 和夏令时 1h 不适用)
<h:outputText value="#item.dateChange">
<f:convertDateTime pattern="dd.MM.yyyy HH:mm" timeZone="#item.platform.timeZone"/>
</h:outputText>
我尝试了以下两种方法,它们都不起作用:
public TimeZone getTimeZone()
return TimeZone.getTimeZone("Europe/Berlin");
public String getTimeZone()
return "Europe/Berlin";
我需要为用户配置时区,如何实现?
编辑: 为了确保时区对象可用:
<h:outputText value="#item.platform.timeZone"/>
sun.util.calendar.ZoneInfo[id="Europe/Berlin",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=143,lastRule=java.util.SimpleTimeZone[id=Europe/Berlin,offset =3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay= -1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]]
或者简单地说:第二次尝试中的“欧洲/柏林”。
【问题讨论】:
只是为了确保这不是一件愚蠢的事情:当您使用 h:outputText 时看到的是 #item.platform.timeZone 属性? @Gimby 要么是 TimeZone 对象的很长的 toString,要么是更高版本中的字符串“Europe/Berlin”。对我来说,表达式语言似乎不适用于此属性,我不知道这有什么特别之处。 此主题可能与您有关:***.com/questions/7122460/… 我想知道 Item bean 的来源是怎样的。请贴出源代码。我已经使用 bean 中的时区设置了一个示例项目。当我在该 bean 中使用简单的 getter 时,它对我有用。 @Gimby 谢谢! BalusC 建议的 customConverter 解决了该问题,您可以将其添加为答案。 【参考方案1】:正如 Gimby 所指出的,BalusC 已经回答了一个类似的问题
由于 f: 标签的限制,需要 customConverter。
此问题的详细描述和 BalsuC 的示例实现可在此处获得: JSF convertDateTime with timezone in datatable
注意:那里提供的转换器期望 bean 返回描述 timeZone 的字符串,而不是 TimeZone 对象。
【讨论】:
以上是关于如果 bean 提供时区,f:convertDateTime 将显示错误的日期的主要内容,如果未能解决你的问题,请参考以下文章
Lync 项目经验-28-设置-所有用户-OWA-时区-语言-跳过-时区设置)