首页 > 解决方案 > Omnifaces of:secondsBetween EL 函数无法通过 of:formatDate 转换为 HH:mm:ss

问题描述

再会

我需要将增量时间显示为两个 java.date.Util 实例之间的差异,格式为“HH:mm:ss”

Omnifaces 库在计算这两个总是在同一天的 java.date.Util 实例之间的秒数差异时似乎非常方便。

一个值是使用 .xhtml 文件顶部的 Primefaces 日历组件设置的,如下所示:

<p:outputLabel for="datetime" value="Marathon Race Start: "/>
<p:calendar id="datetime" value="#{resultsView.marathonStart}" pattern="yyyy/MM/dd HH:mm:ss">
        <p:ajax event="change" immediate="true" update="marathon_results_form:results_all_datatable"/>
</p:calendar>

然后结果显示在 Primefaces 数据表中,如下所示(只有显示为所有其他列的时间列正确):

<p:column headerText="Time - Completed" style="text-align: center; align-content: left">
    <c:set var="raceTime" value="#{of:secondsBetween(resultsView.marathonStart,allResults.dateTimeStamp)}"/>
    #{of:formatDate(raceTime, 'HH:mm:ss')}
</p:column>

上面的代码段会引发运行时错误,说明:

cannot convert of type class java.lang.Long to class java.util.Date

如果我删除 Omnifaces:

#{of:formatDate(raceTime, 'HH:mm:ss')}

并仅替换为:

#{raceTime}

然后将整个列转换为:

<p:column headerText="Time - Completed" style="text-align: center; align-content: left">
    <c:set var="raceTime" value="#{of:secondsBetween(resultsView.marathonStart,allResults.dateTimeStamp)}"/>
    #{raceTime}
</p:column>

通过在表格列中将秒数显示为 long,它确实可以正常工作;并且一旦开始时间通过 Primefaces 日历更新,表中作为长的秒数实时更新;完全应有的样子。

那么,如何在 EL 中(在 WildFly 15 上使用 JSF 2.3.5.SP1)将这些 long 转换为 'HH:mm:ss' 格式?

编辑:

我知道这可以通过将 long raceTime 传递给托管 bean 的方法并从 bean 返回一个字符串来轻松完成;但是,如果这可以通过 EL 或 Omnifaces 更简洁地完成,我宁愿遵循这种方法。

标签: datejsfprimefacesjsf-2omnifaces

解决方案


根据of:formatDateit 期望 ajava.util.Date而不是 a java.lang.Long,因此由于返回值不是 a ,因此可以预期of:secondsBetweenclasscast java.util.Date

所以你所经历的完全符合预期。请参阅“另请参阅”以获得可能的修复,但在支持 bean 中执行此操作也没有错(不是更简洁的 imo)。另外你也可以自己写EL函数,不太难

也可以看看


推荐阅读