2017-08-21 51 views
1

我有一個模型類,其中包含ZonedDateTime類型的字段。當生成報告的數據顯示爲:DynamicReports不適用于格式ZonedDateTime

2017-08-17T16:09:03 + 03:00 [歐洲/基希訥烏]

要格式化我使用方法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())); 
     } 
    } 
} 

生成報告其中列表是元素的泛型列表。

report 
.title(
     Components.text("Documents Report") 
     .setStyle(getHeaderCenteredBoldStyle()) 
     .setHorizontalTextAlignment(HorizontalTextAlignment.CENTER)) 
     .pageFooter(Components.pageXofY()) 
.setColumnTitleStyle(getColumnTitleStyle()) 
.highlightDetailEvenRows() 
.setDataSource(list); 

生成的PDF

generated pdf 任何想法?

+0

實際渲染是做什麼的?僅僅調用'toString()'是不夠的,你必須格式化你的dateTimes,而你的輸出看起來完全像'toString()'結果。 –

+0

@ M.Prokhorov檢查更新,我如何格式化這個。日期。我在exaples中找到的所有東西都是* setPattern()*方法。在回答中檢查更新 – GVArt

+0

在我看來,你的'DynamicReports'版本不支持'java.time'庫。既然您似乎通過反射來構建它,請嘗試使用'setPatternExpression'方法來使用適當的格式表達式代碼。 –

回答

2

看來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轉換的ZonedDateTimeString

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格式化ZonedDateTimeString

// 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(或在內部在實體中執行)。