date - 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 更简洁地完成,我宁愿遵循这种方法。
解决方案
根据of:formatDate
it 期望 ajava.util.Date
而不是 a java.lang.Long
,因此由于返回值不是 a ,因此可以预期of:secondsBetween
classcast java.util.Date
。
所以你所经历的完全符合预期。请参阅“另请参阅”以获得可能的修复,但在支持 bean 中执行此操作也没有错(不是更简洁的 imo)。另外你也可以自己写EL函数,不太难
也可以看看
推荐阅读
- django - Django 和 Nginx(数字海洋)
- javascript - 异步函数阻塞执行
- visual-studio - 在 Visual Studio 中记录完整的调用堆栈
- java - 如何使用服务到服务身份验证使用 Java 对 Azure Key Vault 进行本地开发?
- ruby-on-rails - rails webpack-dev-server“无效的配置对象”
- javascript - 一旦脚本离开函数,iFrame 更改就会消失
- computer-vision - 为什么 100x100 的图像会形成 10'000 维空间?
- c# - 程序集和类版本的兼容性发生了什么?
- groovy - Nexus3 仅下载列表中的 50 个
- javascript - 使用基于随机播放的数字附加变量