5

我正在使用 jaspersoft 的 iReport,我想将new java.util.Date()(即当前日期)转换为该日期前 1 个月。我在文本字段表达式中写什么来实现这一点?

4

3 回答 3

13

您可以使用 Joda-Time Java API。调用对象的minusMonths方法DateTime

jrxml 文件示例:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="joda_sample" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <import value="org.joda.time.DateTime"/>
    <title>
        <band height="79" splitType="Stretch">
            <textField>
                <reportElement x="109" y="23" width="175" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA["Current date: " + new SimpleDateFormat("dd.MM.yyyy").format(new Date())]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="336" y="23" width="200" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA["Current date minus one month: " + DateTime.now().minusMonths(1).toString("dd.MM.yyyy")]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

结果将是:

iReport 中的结果

注意: 不要忘记将 Joda-Time 库添加到类路径(在我的情况下,我已将库添加到iReport的类路径)。

于 2012-06-05T19:01:17.250 回答
2

Java Date API 是出了名的笨拙,有一个有用的第三方替代方案。尝试导入http://joda-time.sourceforge.net/库。

请参阅此帖子: 向 JodaTime Instant 添加天数

于 2012-06-05T19:04:13.057 回答
1

您可以通过以下方式使用Calendar类:

Calendar c=Calendar.getInstance();
c.setTime(myDate); //Yes, it is strange!!! But we don't really need this, for the getInstance() results in a current date.
c.add(Calendar.MONTH, -1);

在您发表评论后,我意识到我无法将其更改为单个表达式,因为 add 返回 void 而不是 new Date()。对于那个很抱歉...

于 2012-06-05T18:47:52.027 回答