更新时区 f:convertDateTime

3
当我更改f:convertDateTimetimeZone时,这并没有改变。
`<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>`

zone是一个元素,使用的是java.util.TimeZone。我使用的是primefaces 3.5。


尝试添加<context-param><param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name><param-value>true</param-value></context-param>。 - Pritesh Shah
我在web.xml文件里有那个参数。 - Mathew Rock
1
@PriteshShah:抱歉,但这完全是无稽之谈。OP试图显式设置timeZone属性,这将始终覆盖默认值。 - BalusC
Matthew,我有这样的印象,你在问题中遗漏了一个非常关键的部分。到目前为止发布的代码在完全空白的<h:body>中工作得非常好(这是每个人在看到JSF代码片段时所期望的)。然而,在你的实际代码中,你很可能实际上将它放在了带有var="bb"<ui:repeat><h:dataTable>中。这个细节不应该被省略在问题中,以至于无法通过将代码复制到空白的<h:body>中再现问题。 - BalusC
BalusC,它在 ** p:datatable ** 内部,adn bb 是 backingBean。感谢您的帮助,您是 JSF 的主掌大师。 - Mathew Rock
1
正如我所猜测的那样。现在,你的问题已经在 https://dev59.com/Xmsz5IYBdhLWcg3w-89v 和 https://dev59.com/SWw05IYBdhLWcg3wpDRu 中得到解答。 - BalusC
2个回答

1
我刚刚在我的应用程序上解决了一个类似的问题。问题出在JSF生命周期上。就像你一样,我正在使用f:convertDateTime处理每个对象上的日期,并使用时区值(我显示世界各地的预订)。
在我的预订列表getter中设置断点,以及在ConvertDateTimeHandler中设置另一个断点,我可以看到JSF在我甚至还没有从后端bean获取预订之前就尝试转换日期。
我正在使用ui:repeat,通过切换到使用JSTL的c:forEach来解决这个问题。
如果您不必使用Primefaces数据表格,则可以尝试类似的解决方案。否则,最好有一个瞬态getter,返回已针对相关时区格式化的日期字符串。
快速证明这一点的方法是获取您集合中的第一个对象,并将其放入h:outputText中,再加上f:convertDateTime。如果它能正确转换,则尝试替代datatable。

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);
    }

我复制了你的代码,但是无法更改hour,我不知道为什么无法更改时区。 - Mathew Rock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接