你不需要变量,直接使用textFieldExpression
如果声明了MO_DATECREATED 和MO_DATECOMPLETED 字段:
作为java.lang.Date
<field name="MO_DATECREATED" class="java.lang.Date">
<fieldDescription><![CDATA[]]></fieldDescription>
</field>
textFieldExpression 将是 ($F{MO_DATECOMPLETED}.getTime()-$F{MO_DATECREATED}.getTime())/(1000*60*60) + " hours"。
嘿,这就是java,所以要了解它的作用,请查看:How to calculate time difference in java?
作为java.lang.String
<field name="MO_DATECREATED" class="java.lang.String">
<fieldDescription><![CDATA[]]></fieldDescription>
</field>
我们需要将它们解析为Date 对象的第一个.. 你的模式是mm/dd/yy hh:mm a
(new java.text.SimpleDateFormat("mm/dd/yy hh:mm a").parse($F{MO_DATECOMPLETED}).getTime()-new java.text.SimpleDateFormat("mm/dd/yy hh:mm a").parse($F{MO_DATECREATED}).getTime())/(1000*60*60) + " hours"
考虑到他们可能是null,我们最好也添加一个printWhenExpression
完整结果
<textField>
<reportElement x="0" y="0" width="100" height="20" uuid="eac93a84-7901-4205-b09c-556d48dc05e1">
<printWhenExpression><![CDATA[new java.lang.Boolean($F{MO_DATECREATED}!=null && $F{MO_DATECOMPLETED}!=null)]]></printWhenExpression>
</reportElement>
<textFieldExpression><![CDATA[(new java.text.SimpleDateFormat("mm/dd/yy hh:mm a").parse($F{MO_DATECOMPLETED}).getTime()-new java.text.SimpleDateFormat("mm/dd/yy hh:mm a").parse($F{MO_DATECREATED}).getTime())/(1000*60*60) + " hours"]]></textFieldExpression>
</textField>
毫无疑问,它们最好是java.lang.Date 对象,这两个报告都会更快地填充,没有解析错误的风险,您可以正确导出到excel ecc。要根据需要格式化 java.lang.Date 对象,只需使用模式属性即可。
编辑:用户选择了java.util.Date,并询问他如何显示分钟数,为此我在How to create a single expression displaying time difference between two Date's as years, months, days, hours, minutes, seconds 上创建了一个一般性问题,现在是answered
这是临时解决方案
<textField>
<reportElement x="0" y="0" width="100" height="20" uuid="eac93a84-7901-4205-b09c-556d48dc05e1">
<printWhenExpression><![CDATA[new java.lang.Boolean($F{MO_DATECREATED}!=null && $F{MO_DATECOMPLETED}!=null)]]></printWhenExpression>
</reportElement>
<textFieldExpression><![CDATA[($F{MO_DATECOMPLETED}.getTime()-$F{MO_DATECREATED}.getTime()) / (24* 60 * 60 * 1000) + " days " +($F{MO_DATECOMPLETED}.getTime()-$F{MO_DATECREATED}.getTime()) / (60 * 60 * 1000) % 24 + " hours " + ($F{MO_DATECOMPLETED}.getTime()-$F{MO_DATECREATED}.getTime()) / (60 * 1000) % 60 + " minutes"]]></textFieldExpression>
</textField>