DynamicReports 不应用模式来格式化 ZonedDateTime
DynamicReports doesn't apply pattern to format ZonedDateTime
我有一个模型 class,其中包含 ZonedDateTime 类型的字段。生成报表数据时显示为:
2017-08-17T16:09:03+03:00[Europe/Chisinau]
为了格式化该日期,我使用方法 setPattern("dd.MM.yyyy")
但没有任何变化。
所有内容都是通过反射生成的,查看来源:
for (Field field : entityClass.getDeclaredFields()) {
String fieldName = field.getName();
if (usedFields.contains(fieldName)) {
field.setAccessible(true);
if(field.getType().isAssignableFrom(Date.class) || field.getType().isAssignableFrom(ZonedDateTime.class)){
report.addColumn(Columns.column(fieldName, fieldName, field.getType()).setPattern("dd.MM.yyyy"));
}else {
report.addColumn(Columns.column(fieldName, fieldName, field.getType()));
}
}
}
生成报告 其中 list 是元素的通用列表。
report
.title(
Components.text("Documents Report")
.setStyle(getHeaderCenteredBoldStyle())
.setHorizontalTextAlignment(HorizontalTextAlignment.CENTER))
.pageFooter(Components.pageXofY())
.setColumnTitleStyle(getColumnTitleStyle())
.highlightDetailEvenRows()
.setDataSource(list);
生成的 PDF
有任何想法吗?
似乎 setPattern
适用于 java.util.Date
,但不适用于 java.time.ZonedDateTime
。我创建了一个简单的实体:
public class Entity {
private ZonedDateTime zonedDateTime = ZonedDateTime.parse("2017-08-17T16:09:03+03:00[Europe/Chisinau]");
private Date date = new Date();
// getters and setters
}
然后我使用您的代码 (for (Field field : entityClass.getDeclaredFields()) etc
) 添加了列。对于数据源list
,我是手动创建的,只是为了测试:
DRDataSource ds = new DRDataSource("zonedDateTime", "date");
ds.add(entity.getZonedDateTime(), entity.getDate());
在结果报告中,ZonedDateTime
没有格式化(显示为 2017-08-17T16:09:03+03:00[Europe/Chisinau]
),但 Date
正确显示为 21.08.2017
。
解决此问题的一种方法是设置值格式化程序并使用 java.time.format.DateTimeFormatter
将 ZonedDateTime
转换为 String
:
if (field.getType().isAssignableFrom(ZonedDateTime.class)) {
// ZonedDateTime, use a value formatter
report.addColumn(Columns.column(fieldName, fieldName, ZonedDateTime.class)
// set a custom value formatter
.setValueFormatter(new AbstractValueFormatter<String, ZonedDateTime>() {
@Override
public String format(ZonedDateTime value, ReportParameters reportParameters) {
// convert ZonedDateTime to dd.MM.yyyy format
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd.MM.yyyy");
return value.format(fmt);
}
}));
} else if (field.getType().isAssignableFrom(Date.class)) {
// java.util.Date: setPattern works
report.addColumn(Columns.column(fieldName, fieldName, field.getType()).setPattern("dd.MM.yyyy"));
...
有了这个,ZonedDateTime
以 DateTimeFormatter
中定义的格式显示:
17.08.2017
在这个例子中,我在内部 class 中创建 DateTimeFormatter
,但最好只在 if
之外创建一个格式化程序(它可以在 static final
字段,因为它是不可变的和线程安全的)并在您的应用程序中重用它。
另一种方法是手动将 ZonedDateTime
格式化为 String
,使用相同的 java.time.format.DateTimeFormatter
,但在数据源列表中。我还必须将列的类型更改为 String
(在 for
内):
if (field.getType().isAssignableFrom(ZonedDateTime.class)) {
// ZonedDateTime, manually convert to String
report.addColumn(Columns.column(fieldName, fieldName, String.class));
} else if (field.getType().isAssignableFrom(Date.class)) {
// java.util.Date: setPattern works
report.addColumn(Columns.column(fieldName, fieldName, field.getType()).setPattern("dd.MM.yyyy"));
} else {
report.addColumn(Columns.column(fieldName, fieldName, field.getType()));
}
然后,在数据源 list
中,我不得不使用 DateTimeFormatter
将 ZonedDateTime
格式化为 String
:
// create formatter
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd.MM.yyyy");
// format the ZonedDateTime
ds.add(entity.getZonedDateTime().format(fmt), entity.getDate());
有了这个,ZonedDateTime
现在显示为 17.08.2017
。
我不确定您是如何创建值的 list
,但您必须更改它以按照上述方式格式化 ZonedDateTime
(或在内部执行)在实体中)。
我有一个模型 class,其中包含 ZonedDateTime 类型的字段。生成报表数据时显示为:
2017-08-17T16:09:03+03:00[Europe/Chisinau]
为了格式化该日期,我使用方法 setPattern("dd.MM.yyyy")
但没有任何变化。
所有内容都是通过反射生成的,查看来源:
for (Field field : entityClass.getDeclaredFields()) {
String fieldName = field.getName();
if (usedFields.contains(fieldName)) {
field.setAccessible(true);
if(field.getType().isAssignableFrom(Date.class) || field.getType().isAssignableFrom(ZonedDateTime.class)){
report.addColumn(Columns.column(fieldName, fieldName, field.getType()).setPattern("dd.MM.yyyy"));
}else {
report.addColumn(Columns.column(fieldName, fieldName, field.getType()));
}
}
}
生成报告 其中 list 是元素的通用列表。
report
.title(
Components.text("Documents Report")
.setStyle(getHeaderCenteredBoldStyle())
.setHorizontalTextAlignment(HorizontalTextAlignment.CENTER))
.pageFooter(Components.pageXofY())
.setColumnTitleStyle(getColumnTitleStyle())
.highlightDetailEvenRows()
.setDataSource(list);
生成的 PDF
似乎 setPattern
适用于 java.util.Date
,但不适用于 java.time.ZonedDateTime
。我创建了一个简单的实体:
public class Entity {
private ZonedDateTime zonedDateTime = ZonedDateTime.parse("2017-08-17T16:09:03+03:00[Europe/Chisinau]");
private Date date = new Date();
// getters and setters
}
然后我使用您的代码 (for (Field field : entityClass.getDeclaredFields()) etc
) 添加了列。对于数据源list
,我是手动创建的,只是为了测试:
DRDataSource ds = new DRDataSource("zonedDateTime", "date");
ds.add(entity.getZonedDateTime(), entity.getDate());
在结果报告中,ZonedDateTime
没有格式化(显示为 2017-08-17T16:09:03+03:00[Europe/Chisinau]
),但 Date
正确显示为 21.08.2017
。
解决此问题的一种方法是设置值格式化程序并使用 java.time.format.DateTimeFormatter
将 ZonedDateTime
转换为 String
:
if (field.getType().isAssignableFrom(ZonedDateTime.class)) {
// ZonedDateTime, use a value formatter
report.addColumn(Columns.column(fieldName, fieldName, ZonedDateTime.class)
// set a custom value formatter
.setValueFormatter(new AbstractValueFormatter<String, ZonedDateTime>() {
@Override
public String format(ZonedDateTime value, ReportParameters reportParameters) {
// convert ZonedDateTime to dd.MM.yyyy format
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd.MM.yyyy");
return value.format(fmt);
}
}));
} else if (field.getType().isAssignableFrom(Date.class)) {
// java.util.Date: setPattern works
report.addColumn(Columns.column(fieldName, fieldName, field.getType()).setPattern("dd.MM.yyyy"));
...
有了这个,ZonedDateTime
以 DateTimeFormatter
中定义的格式显示:
17.08.2017
在这个例子中,我在内部 class 中创建 DateTimeFormatter
,但最好只在 if
之外创建一个格式化程序(它可以在 static final
字段,因为它是不可变的和线程安全的)并在您的应用程序中重用它。
另一种方法是手动将 ZonedDateTime
格式化为 String
,使用相同的 java.time.format.DateTimeFormatter
,但在数据源列表中。我还必须将列的类型更改为 String
(在 for
内):
if (field.getType().isAssignableFrom(ZonedDateTime.class)) {
// ZonedDateTime, manually convert to String
report.addColumn(Columns.column(fieldName, fieldName, String.class));
} else if (field.getType().isAssignableFrom(Date.class)) {
// java.util.Date: setPattern works
report.addColumn(Columns.column(fieldName, fieldName, field.getType()).setPattern("dd.MM.yyyy"));
} else {
report.addColumn(Columns.column(fieldName, fieldName, field.getType()));
}
然后,在数据源 list
中,我不得不使用 DateTimeFormatter
将 ZonedDateTime
格式化为 String
:
// create formatter
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd.MM.yyyy");
// format the ZonedDateTime
ds.add(entity.getZonedDateTime().format(fmt), entity.getDate());
有了这个,ZonedDateTime
现在显示为 17.08.2017
。
我不确定您是如何创建值的 list
,但您必须更改它以按照上述方式格式化 ZonedDateTime
(或在内部执行)在实体中)。