【问题标题】:Timezone conversion and date formatting in jasper reports?碧玉报告中的时区转换和日期格式?
【发布时间】:2019-03-04 09:14:34
【问题描述】:

我正在使用 Jasper 报告,我想在其中显示选定的日期范围和时间。我使用以下表达式来格式化日期,但它显示的是 GMT 时区的时间。

new SimpleDateFormat("dd-MMM-yyyy").format($P{START_DATE})+" "+new SimpleDateFormat("HH:mm").format($P{startTime})

以上代码给出的日期为 2019 年 3 月 1 日 14:30,根据 IST 应为 2019 年 3 月 1 日下午 8:00。

如何处理时区以显示正确的时间?

【问题讨论】:

  • 你试过设置时区吗?
  • 是的,我试过但无法将其写在一个语句中。我尝试了以下方法。 new SimpleDateFormat("HH:mm").setTimeZone('IST').format($P{startTime}) - 这会产生错误,因为 format() 不能应用于 void 类型,因为 setTimeZone() 返回 void。
  • 是否要求写在一个语句中?
  • 是的。我们不能在jasper中编写多行表达式/java代码(一行将是对象创建,在这个对象上调用setTimezone(),然后调用format()来格式化我的输入日期)。
  • 我建议你不要使用SimpleDateFormat。这个类是出了名的麻烦和过时。而是使用DateTimeFormatter 和java.time, the modern Java date and time API 中的其他类。

标签: java timezone jasper-reports simpledateformat date-conversion


【解决方案1】:

也许你应该只为你的环境设置 TimeZone,一般来说你应该 avoid using 旧的 java.util.Date 类。

如果你运行在java 8或以上,你可以使用类似的代码来显示所需时区的时间。

<textField>
    <reportElement x="0" y="0" width="100" height="30" uuid="ac702c94-69e5-4439-9d32-3c944119dbe6"/>
    <textFieldExpression>
       <![CDATA[java.time.format.DateTimeFormatter.ofPattern("dd-MMM-yyyy HH:mm").
     withZone(java.time.ZoneId.of("Asia/Calcutta")).format($P{START_DATE}.toInstant())]]>
   </textFieldExpression>
</textField>

如果您未使用 java 8,则可以使用 ThreeTen-Backport 或 Joda-Time 等库来获得此功能。

在同一个 java.util.Date 上具有不同 zoneId 的完整示例

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="TimeZone" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="b3143043-a16b-43db-81c4-6313b0d4922c">
    <parameter name="START_DATE" class="java.util.Date">
        <defaultValueExpression><![CDATA[new java.util.Date()]]></defaultValueExpression>
    </parameter>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <title>
        <band height="60" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="0" width="150" height="20" uuid="a0353412-1861-4c12-ac26-b40a6768a88c"/>
                <textElement textAlignment="Center" verticalAlignment="Middle">
                    <font isBold="true"/>
                </textElement>
                <text><![CDATA[America/New_York]]></text>
            </staticText>
            <staticText>
                <reportElement x="150" y="0" width="150" height="20" uuid="28b938b9-d117-4447-91d2-b5bb9334bad6"/>
                <textElement textAlignment="Center" verticalAlignment="Middle">
                    <font isBold="true"/>
                </textElement>
                <text><![CDATA[Europe/Rome]]></text>
            </staticText>
            <staticText>
                <reportElement x="300" y="0" width="150" height="20" uuid="adceb53f-555d-4be3-bd1e-c9d55b90d90d"/>
                <textElement textAlignment="Center" verticalAlignment="Middle">
                    <font isBold="true"/>
                </textElement>
                <text><![CDATA[Asia/Calcutta]]></text>
            </staticText>
            <textField>
                <reportElement x="0" y="20" width="150" height="20" uuid="ebf48192-f394-447b-8264-e66c56289f54"/>
                <textElement textAlignment="Center" verticalAlignment="Middle"/>
                <textFieldExpression><![CDATA[java.time.format.DateTimeFormatter.ofPattern("dd-MMM-yyyy HH:mm").withZone(java.time.ZoneId.of("America/New_York")).format($P{START_DATE}.toInstant())]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="150" y="20" width="150" height="20" uuid="ebf48192-f394-447b-8264-e66c56289f54"/>
                <textElement textAlignment="Center" verticalAlignment="Middle"/>
                <textFieldExpression><![CDATA[java.time.format.DateTimeFormatter.ofPattern("dd-MMM-yyyy HH:mm").withZone(java.time.ZoneId.of("Europe/Rome")).format($P{START_DATE}.toInstant())]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="300" y="20" width="150" height="20" uuid="ac702c94-69e5-4439-9d32-3c944119dbe6"/>
                <textElement textAlignment="Center" verticalAlignment="Middle"/>
                <textFieldExpression><![CDATA[java.time.format.DateTimeFormatter.ofPattern("dd-MMM-yyyy HH:mm").withZone(java.time.ZoneId.of("Asia/Calcutta")).format($P{START_DATE}.toInstant())]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

输出

【讨论】:

  • 有了这个代码,它仍然让我在亚洲/加尔各答地区有同样的时间。
  • @PratikRawlekar 我添加了一个可以测试的完整示例
【解决方案2】:

使用内置日期格式化功能,根据报表时区(REPORT_TIME_ZONE参数的值)格式化数值:

DATEFORMAT($P{START_DATE}, "dd-MMM-yyyy") + " " + DATEFORMAT($P{startTime}, "HH:mm")

【讨论】:

  • 我在使用后遇到错误。由以下原因引起:net.sf.jasperreports.engine.fill.JRExpressionEvalException:评估源文本的表达式时出错:“:”+DATEFORMAT($P{START_DATE},“dd-MMM-yyyy”)+“”+DATEFORMAT($P {startTime}, "HH:mm")+" 到 "+DATEFORMAT($P{END_DATE}, "dd-MMM-yyyy") + " " + DATEFORMAT($P{endTime}, "HH:mm")
  • 发布完整的异常堆栈跟踪(包括由..行引起的)。
  • 在net.sf 产生的原因:java.lang.NoClassDefFoundError:在details_summary_1551698058964_17203.DATEFORMAT net.sf.jasperreports.functions.standard.DateTimeFunctions(details_summary_1551698058964_17203:1209)在details_summary_1551698058964_17203.evaluate(401 details_summary_1551698058964_17203) .jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:251) ... 19 更多
  • 在运行报告的应用程序的类路径中是否有 jasperreports-functions jar?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 2011-03-25
  • 2012-06-10
相关资源
最近更新 更多