使用dataTable primefaces列的日期转换器

时间:2015-03-30 14:44:55

标签: date jsf 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:]

任何想法?

2 个答案:

答案 0 :(得分:2)

EL中的-运算符仅在java.lang.Number上运行。 java.util.Date不是其中的子类。您需要通过Date#getTime()方法从中获取原始时间戳,该方法以long的风格返回以毫秒为单位的纪元时间,其在EL中被解释为java.lang.Long,是brace notation的完整子类。 1}}。

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

java.lang.Number

(请注意,我通过删除不必要的output textEL function来简化EL表达式

忽略DST影响,您可以将结果除以一整天可以包含的毫秒数:<p:column headerText="Nbr"> #{demande.dateEnd.time - demande.dateStart.time} </p:column>

1000 * 60 * 60 * 24

如果您想考虑DST影响,那么您最好在Java方面完成这项工作,最好使用可重复使用的OmniFaces。 JSF实用程序库of:daysBetween()开箱即用,source code here({{3}}):

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

答案 1 :(得分:1)

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

执行bean中的逻辑,即为此目的编写新方法。 通过这种方式,您可以拥有以下内容:

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

鉴于你有一个类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?