【问题标题】:Omnifaces of:secondsBetween EL function cannot be converted to HH:mm:ss by of:formatDateOmnifaces of:secondsBetween EL 函数无法通过 of:formatDate 转换为 HH:mm:ss
【发布时间】: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


【解决方案1】:

根据of:formatDate,它需要java.util.Date 而不是java.lang.Long,因此由于of:secondsBetween 的返回值不是java.util.Date,因此可以预期类转换。

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

另请参阅

【讨论】:

  • @Kukeltjie 谢谢,目前正在调查这些选项。
  • 感谢您抽出宝贵时间回复。非常感激。我会尽力满足您的要求。
猜你喜欢
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
  • 2021-05-18
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多