当我更改f:convertDateTime的 timeZone 时,这不会改变。
`<p:dataTable id="tabla2" value="#{bb.dataTable}" var="trm" resizableColumns="true"
style="width : 1400px" editable="true" editMode="cell"
rowStyleClass="#{styleController.daColoresParaEstadoTramos(trm, bb.fechaInicio)}"><p:column>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{trm.tramo.horaDespeguePrevista}">
<f:convertDateTime pattern="HH:mm" timeZone="#{bb.zonaH}" />
</h:outputText>
</f:facet>
<f:facet name="input">
<p:inputMask value="#{trm.tramo.horaDespeguePrevista}" mask="99:99" >
<f:convertDateTime pattern="HH:mm" timeZone="#{bb.zona}" />
</p:inputMask>
</f:facet>
</p:cellEditor>
</p:column></p:dataTable>`
区域是元素java.util.TimeZone。我使用primefaces 3.5
答案 0 :(得分:1)
我刚在我的应用上解决了类似的问题。问题在于JSF生命周期。和你一样,我收集了一些对象,并使用f:convertDateTime
在每个对象上使用日期,使用时区值(我显示了世界各地的预订)。
在getter中为我的预订列表设置断点,在ConvertDateTimeHandler
中设置另一个断点我可以看到JSF在我从支持bean获得预订之前转换了日期。
我使用ui:repeat
并且能够通过切换到使用JSTL中的c:forEach
来解决此问题。
如果您不必拥有Primefaces数据表,您可以做类似的事情。否则你可能最好使用一个瞬态getter,它返回一个已经为相关时区格式化的日期字符串。
证明这一点的一种快速方法是获取集合中的第一个对象,并将其与h:outputText
一起放入f:convertDateTime
。如果它正确转换,那么尝试替换数据表。
答案 1 :(得分:0)
使用<f:ajax/>
更改时间。
在xhtml上添加以下代码。
<p>
<h:selectOneMenu value="#{bb.zone}">
<f:selectItems value="#{bb.timeZones}"/>
<f:ajax execute="@this" listener="#{bb.changeZone()}" render="hour"/>
</h:selectOneMenu>
</p>
<p>
<h:outputText id="hour" value="#{bb.hour}">
<f:convertDateTime pattern="HH:mm" timeZone="#{bb.zone}" />
</h:outputText>
</p>
并在托管bean中添加以下代码
private Date hour=new Date();
private String zone;
private List<String> timeZones=new ArrayList<String>();
public Bean() {
timeZones= Arrays.asList( TimeZone.getAvailableIDs());
}
public void changeZone(){
System.out.println("Time Zone : "+ zone);
}