看來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
定義的格式:
2017年8月17日
在這個例子中,我在內部類中創建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
(或在內部在實體中執行)。
實際渲染是做什麼的?僅僅調用'toString()'是不夠的,你必須格式化你的dateTimes,而你的輸出看起來完全像'toString()'結果。 –
@ M.Prokhorov檢查更新,我如何格式化這個。日期。我在exaples中找到的所有東西都是* setPattern()*方法。在回答中檢查更新 – GVArt
在我看來,你的'DynamicReports'版本不支持'java.time'庫。既然您似乎通過反射來構建它,請嘗試使用'setPatternExpression'方法來使用適當的格式表達式代碼。 –