如果 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 将显示错误的日期的主要内容,如果未能解决你的问题,请参考以下文章

xorm 条件查询时区的问题

在java中按提供的时区格式化日期[重复]

Lync 项目经验-28-设置-所有用户-OWA-时区-语言-跳过-时区设置)

为啥 datetime 为同一时区提供不同的时区格式?

PowerShell 运维菜鸟系列-03-设置-所有用户-OWA-时区-语言-跳过-时区设置)

JS:如何获取时区