【发布时间】:2019-08-02 15:59:57
【问题描述】:
美好的一天
我需要将增量时间显示为两个 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>
上面的 sn -p 抛出运行时错误说明:
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 更简洁地完成,我宁愿采用这种方法。
【问题讨论】:
-
它可以使用普通的 jsf 数据表吗?如果是这样,它与 PrimeFaces 无关,甚至与没有任何数据表的简单的“h:outputText”无关,当我查看错误时很可能不是。您似乎期望 Long 可以转换为日期,而根据错误却不能。该函数称为 formatDate 而不是
convertLongInSecondsToHoursAndMinutes。 -
题外话:如果它可以工作,你可以在一个没有
c:set的EL 中做到这一点,比如#{of:formatDate(of:secondsBetween(resultsView.marathonStart,allResults.dateTimeStamp), 'HH:mm:ss')}? -
@Kukeltje 感谢您抽出宝贵时间回复。我不能使用 JSF 数据表,因为要求包括 Primefaces 数据表提供的开箱即用功能。不使用 c:set 表单无法在运行时呈现(可能是由于 Omnifaces 标签不喜欢嵌套在 EL 中(来自 Omnifaces 站点的示例也使用 c:set) - 这意味着您的第二个回复要合二为一在运行时失败。formatDate 和/或 formatDateTime EL 函数需要一个日期(带有年、月和日的东西)来转换。它不能将 delta long (4792L) 秒数转换为 HH:mm:ss
-
TRY,TRY,TRY,缩小问题范围,我没有说过你应该在生产中使用 h:datatable... 唉...
-
@Kukeltje,我查看了下面的链接,个人觉得在这种情况下,在托管 bean 中管理例如 4777L 到 HH:mm:ss 的转换是最好的。所有其他“formatDate”(来自标准 JSF 或 Omnifaces)都需要一个正确的日期,该日期自纪元以来的秒数非常长。不必处理时区等,在返回字符串的 bean 方法中转换 4777L 似乎是更健壮的方法,因为不涉及时区或时代。希望 JSF EL 能用很长的时间做到这一点;因此问题的原因;)
标签: date jsf primefaces jsf-2 omnifaces