使用 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.Long
,java.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>
我正在使用 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.Long
,java.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>