【问题标题】:Calculating Time and Date difference计算时间和日期差异
【发布时间】:2016-09-21 18:07:24
【问题描述】:

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

我要比较的两个变量是 MO_DATECREATED 和 MO_DATECOMPLETED,我只尝试计算 时间 差异。

我尝试设置一个变量,对两个变量进行简单的减法运算——当然这根本不起作用。

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

示例:如果 MO 是 started at 1/2/15 12:55pm 和 completed at 1/3/15 1:55pm,我想打印时间差,或者用了多长时间,如 25 hours

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

EDIT回答后,我想秀天到:

【问题讨论】:

  • 字段 MO_DATECRE 和 MO_DATECOMP 是什么类? java.lang.Date 还是 java.lang.String??
  • 目前表达式类是 java.lang.String
  • 好的会给你一个答案...为什么不日期????
  • 我不确定为什么它不是日期。我只是放下一个文本字段并将其传递给表值 MO_DATECREATED
  • 我总是可以使用 iReport 中的下拉框并将表达式类设置为 Date

标签: java jasper-reports


【解决方案1】:

你不需要变量,直接使用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"。

嘿,这就是,所以要了解它的作用,请查看: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>

【讨论】:

  • 如何让这个也显示小时和分钟?
  • 它在 java.lang.Date 格式中,您的 java 语句有效!但它只显示小时 - 显示小时和分钟的数学是什么?
  • 我仍然无法显示小时和分钟 - 谢谢 Petter!
  • 好吧,让我们试试吧... :) 你在用 java8 吗?
  • 是的,我正在使用 iReport 编写报告:/
猜你喜欢
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 2021-11-25
  • 2011-08-01
  • 1970-01-01
相关资源
最近更新 更多