计算时间和日期差异

时间:2016-01-07 17:28:27

标签: java jasper-reports

我目前正在编写一份报告来计算 iReport 中两个日期变量之间的TotalTimeDifference

我要比较的两个变量是MO_DATECREATEDMO_DATECOMPLETED,我只想计算 时间 差异。

我已经尝试设置一个变量来简单地减去这两个变量 - 当然这根本没有用。

我会附上我目前所拥有的照片,但我正在寻找比较两个变量(包含日期/时间)并打印出时间差异变量的方法。

示例:如果MO为started at 1/2/15 12:55pmcompleted at 1/3/15 1:55pm,我想打印时差或花费的时间,为25 hours

我如何在iReport中执行此操作?谢谢你帮助新手!

My problem MyReport

编辑回答后,我想在节目时间:

1 个答案:

答案 0 :(得分:0)

您不需要变量,直接使用textFieldExpression

如果声明了字段MO_DATECREATEDMO_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"

嘿,完全可以理解它的作用,请查看以下内容: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创建了一般问题,现在{ {3}}

这是临时解决方案

<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>