java - 碧玉报告中的时区转换和日期格式?
问题描述
我正在使用 Jasper 报告,我想在其中显示选定的日期范围和时间。我使用以下表达式来格式化日期,但它显示的是 GMT 时区的时间。
new SimpleDateFormat("dd-MMM-yyyy").format($P{START_DATE})+" "+new SimpleDateFormat("HH:mm").format($P{startTime})
上面的代码给出的日期为 01-Mar-2019 14:30,根据 IST 应该是 01-Mar-2019 8:00PM。
如何处理时区以显示正确的时间?
解决方案
可能您应该将 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等库来获得此功能。
相同 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>
输出
推荐阅读
- python-3.x - 数据框:将基于行的交易数据转换为每个日期的聚合
- c++ - 将结构向量保存到文件中并从 C++ 文件中读取结构向量
- mongodb - 无法在 db.createUser() 中使用身份验证机制
- python - 在列表中搜索;根据搜索输入显示名称
- windows-subsystem-for-linux - 如何从另一台计算机访问 linux 2 文件系统的 windows 子系统?
- python - Python:检查程序是否正在关闭
- assembly - 从哪里获取硬件的 I/O 端口地址分配?
- javascript - 让 Discord Selfbot 加入服务器
- c++ - 安装 v142 以使用 v142 构建工具进行构建
- amazon-web-services - AWS Amplify Cognito 中的禁用用户仍然可以访问 API 中的数据