使用 dataTable primefaces 列的日期转换器

Date converter using columns of dataTable primefaces

我正在使用 primefaces 并且我有一个数据表 包含 3 列:DateStart、DateEnd 和 NombreOfDay,我想获得 DateStart 和 DateEnd 之间的差异并将结果放在 NombreOfDay 上,这个是我尝试做的:

 <p:dataTable var="demande"   value="#{myBean.allDemandes}"> 
 <p:column headerText="Start:" >
 <h:outputText value="#{myBean.dateStart}" >
 <f:convertDateTime type="date" pattern="dd.MM.yyyy" timeZone="CET" />   </h:outputText></p:column>

 <p:column headerText="End:" > 
<h:outputText value="#{myBean.dateEnd}" >
<f:convertDateTime type="date" pattern="dd.MM.yyyy" timeZone="CET" /></h:outputText>
 </p:column>
 <!-- Nombre of days between two date -->
 <p:column headerText="Nbr"   >
    <h:outputText value="#{demande['dateEnd']-demande['dateStart']}"  >
    </h:outputText>
    </p:column>

但是我得到这个错误:

   java.lang.IllegalArgumentException: Cannot convert 31/03/15 00:00 of type class java.util.Date to Number
at org.apache.el.lang.ELArithmetic.coerce(ELArithmetic.java:407) [jbossweb-7.0.13.Final.jar:]
at org.apache.el.lang.ELArithmetic.subtract(ELArithmetic.java:315) [jbossweb-7.0.13.Final.jar:]
at org.apache.el.parser.AstMinus.getValue(AstMinus.java:41) [jbossweb-7.0.13.Final.jar:]
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189) [jbossweb-7.0.13.Final.jar:]

有什么想法吗?

您无法按照您尝试的方式减去 Date 个对象。 - 运算符期望参数是一个数字(或者至少可以强制转换)。这是发生异常的地方。你甚至期望结果是什么?天?分钟?

在 bean 中执行逻辑,即为此目的编写一个新方法。 这样,你就会得到类似的东西:

<h:outputText value="#{myBean.calcDurationInDays(demande)}" />

鉴于您有 class Demande,您的支持 bean 方法可能是:

public int calcDurationInDays(Demande demande){
   //calculate difference between demande's start and end date
   return difference;
}

关于如何获取 java 中日期之间的差异,有许多线程和库,例如:How do you subtract Dates in Java?

EL 中的 - 运算符作用于 java.lang.Number only. The java.util.Date isn't a subclass of that. You need to get the raw timestamp out of it via Date#getTime() method which returns the epoch time in milliseconds in flavor of long which is in EL interpreted as java.lang.Longjava.lang.Number 的一个完整子类。

所以,基本上下面会以毫秒为单位打印差异:

<p:column headerText="Nbr">
    #{demande.dateEnd.time - demande.dateStart.time}
</p:column>

(请注意,我通过删除不必要的 brace notation and output text 简化了 EL 表达式)

忽略夏令时的影响,您可以将结果除以一整天的毫秒数:1000 * 60 * 60 * 24:

<p:column headerText="Nbr">
    #{(demande.dateEnd.time - demande.dateStart.time) / (1000 * 60 * 60 * 24)}
</p:column>

如果您想考虑 DST 的影响,那么您最好在 Java 方面完成这项工作,最好使用可重复使用的 EL function. JSF utility library OmniFaces has one out the box, the of:daysBetween() (source code here):

<p:column headerText="Nbr">
    #{of:daysBetween(demande.dateStart, demande.dateEnd)}
</p:column>