Search code examples
javajasper-reportsjava-time

How to format java.time.LocalDateTime and java.time.LocalDate with pattern?


In the following snipped the property $F is of class java.time.LocalDateTime or java.time.LocalDate.

<textField pattern="EE. dd.MM.yyyy">
    <reportElement...>
    </reportElement>
    <textFieldExpression><![CDATA[$F{theLocalDateTime}]]></textFieldExpression>
</textField>

How can I format this property with textField pattern in jasper reports?


Solution

  • To use the pattern attribute in current version of jasper-report for Date/Time object you need a java.util.Date class or one of it's subclasses.

    The solution is to convert java.time.LocalDate and java.time.LocalDateTime

    Converting to java.util.Date

    from java.time.LocalDate

    <textField pattern="EE. dd.MM.yyyy">
        <reportElement...>
        </reportElement>
        <textFieldExpression><![CDATA[java.util.Date.from($F{theLocalDate}.atStartOfDay(java.time.ZoneId.systemDefault()).toInstant())]]></textFieldExpression>
    </textField>
    

    from java.time.LocalDateTime

    <textField pattern="EE. dd.MM.yyyy">
        <reportElement...>
        </reportElement>
        <textFieldExpression><![CDATA[java.util.Date.from($F{theLocalDateTime}.atZone(java.time.ZoneId.systemDefault()).toInstant())]]></textFieldExpression>
    </textField>
    

    Converting to java.sql.Timestamp

    from java.time.LocalDate

    <textField pattern="EE. dd.MM.yyyy">
        <reportElement...>
        </reportElement>
        <textFieldExpression><![CDATA[java.sql.Timestamp.valueOf($F{theLocalDate}.atStartOfDay())]]></textFieldExpression>
    </textField>
    

    from java.time.LocalDateTime

    <textField pattern="EE. dd.MM.yyyy">
        <reportElement...>
        </reportElement>
        <textFieldExpression><![CDATA[java.sql.Timestamp.valueOf($F{theLocalDateTime})]]></textFieldExpression>
    </textField>
    

    Note: Applying pattern is always preferable solution, specially when exporting to excel since correct class will be passed to poi (hence excel will recognize column as a date and apply same formatting as in pattern)