Преобразование часового пояса и форматирование даты в отчетах яшмы? - PullRequest
0 голосов
/ 04 марта 2019

Я работаю с отчетом Jasper, где хочу показать выбранный диапазон дат вместе со временем.Я использовал следующее выражение для форматирования даты, но оно показывает время в часовом поясе GMT.

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

Приведенный выше код дает дату 01 марта 2019 года 14:30, которая должна быть 01 марта 2019 года 20:00 согласно IST.

Как я могу обрабатывать часовой пояс дляпоказать правильное время?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Возможно, вам следует просто установить TimeZone для вашей среды, и в целом вам следует избегать использования старого 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 , чтобы иметь эту функцию.

Полный пример с другим zoneId на том же java.util.Date

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>

Выход

result

0 голосов
/ 04 марта 2019

Используйте встроенную функцию форматирования даты для форматирования значений в соответствии с часовым поясом отчета (значение параметра REPORT_TIME_ZONE):

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