Omnifaces of:secondsBetween EL 函数无法通过 of:formatDate 转换为 HH:mm:ss
Omnifaces of:secondsBetween EL function cannot be converted to HH:mm:ss by of:formatDate
美好的一天
我需要将增量时间显示为两个 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>
通过在 table 列中将秒数显示为 long,它确实可以正常工作;一旦开始时间通过 Primefaces 日历更新,秒数就会在 table 中实时更新;完全正确。
那么,我如何在 EL 中(在 WildFly 15 上使用 JSF 2.3.5.SP1)将这些长整数转换为 'HH:mm:ss' 格式?
编辑:
我知道这可以通过将长 raceTime 传递给托管 bean 的方法并从 bean 返回一个字符串来轻松完成;但是,如果这可以通过 EL 或 Omnifaces 更简洁地完成,我宁愿采用这种方法。
根据 of:formatDate
it expects a java.util.Date
and not a java.lang.Long
, so the classcast is to be expected since the return value of of:secondsBetween
不是 java.util.Date
。
所以你的体验完全符合预期。请参阅 'See also' 以获取可能的修复方法,但在支持 bean 中执行此操作也没有错(我认为不少)。另外你也可以自己写EL函数,难度不大
另见
- Explanation of "ClassCastException" in Java
- How to format date in JSTL
- How to create a custom EL function to invoke a static method?
美好的一天
我需要将增量时间显示为两个 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>
通过在 table 列中将秒数显示为 long,它确实可以正常工作;一旦开始时间通过 Primefaces 日历更新,秒数就会在 table 中实时更新;完全正确。
那么,我如何在 EL 中(在 WildFly 15 上使用 JSF 2.3.5.SP1)将这些长整数转换为 'HH:mm:ss' 格式?
编辑:
我知道这可以通过将长 raceTime 传递给托管 bean 的方法并从 bean 返回一个字符串来轻松完成;但是,如果这可以通过 EL 或 Omnifaces 更简洁地完成,我宁愿采用这种方法。
根据 of:formatDate
it expects a java.util.Date
and not a java.lang.Long
, so the classcast is to be expected since the return value of of:secondsBetween
不是 java.util.Date
。
所以你的体验完全符合预期。请参阅 'See also' 以获取可能的修复方法,但在支持 bean 中执行此操作也没有错(我认为不少)。另外你也可以自己写EL函数,难度不大
另见
- Explanation of "ClassCastException" in Java
- How to format date in JSTL
- How to create a custom EL function to invoke a static method?