2011-03-09 23 views
3

有沒有什麼方法可以輕鬆格式化Freemarker中的Joda DateTime對象?例如對於Java日期,我們可以使用?字符串和其他指令。Freemarker對JodaTime有任何整合嗎?

我知道我可以打電話給日期並獲得Java日期,但我希望有更好的方法。

回答

8

您應該能夠直接從Freemarker的調用toString(String pattern)方法:

${dateTime.toString('MM-dd-yy')}

(未測試)

+0

太棒了,我是Joda的新手,沒有看到這個API。我認爲從我在Java日期世界的過去,我認爲它必須是很難的。 – Andy 2011-03-22 22:08:48

3

我不相信目前在Freemarker中有任何JodaTime的整合。將一個對象放入模型中進行格式化非常容易,例如:

使用格式(String pattern,DateTime dateTime)方法編寫一個類「MyCustomJodaFormatterBean」。把這個的一個實例放在根中。

root.put(「joda」,new MyCustomJodaFormatterBean());

在freemarker中

然後,

${joda.format("MM-dd-yyy", dateTime)} 
8

甚至還有一個這樣做更簡單,如果你不想濺起toString('MM-dd-yy')遍佈您的模板。

簡單地擴展了Freemarker的DefaultObjectWrapper,使它能夠理解喬達時間開箱:

public class JodaAwareObjectWrapper extends DefaultObjectWrapper { 

    @Override 
    public TemplateModel wrap(final Object obj) throws TemplateModelException { 
    if (obj == null) { return super.wrap(obj); } 
    if (obj instanceof LocalDate) { return new SimpleDate(((LocalDate) obj).toDate(), TemplateDateModel.DATE); } 
    // add support for all desired types here... 
    return super.wrap(obj); 
    } 
} 

,當你啓動你的FreeMarker引擎養活這個對象包裝到FreeMarker的配置

Configuration config = // ... 
config.setObjectWrapper(new JodaAwareObjectWrapper()); 

然後,您可以使用FreeMarkers標準日期內置插件,如${dateTime?date}在您的模板中

+1

+1,但更容易編寫'if(obj instanceof LocalDate){return super.wrap(((LocalDate)obj).toDate()); }'。此外,'if(obj == null){...}'行是多餘的。 – antak 2014-07-21 04:48:34

2

在解析FTL fil es freemarker構建了其內部對象模型。例如,java.util.Date表達式被包裝成freemarker.template.SimpleDate。如果您的模型的表達式值的類型爲org.joda.time.DateTime - 它對於freemarker是未知的,它將被默認包裝爲freemarker.ext.beans.StringModel,使用toString()方法將DateTime轉換爲字符串。

例如,假設我們有FTL表達,如:

med.expiryDate?date <= today?date 

其中 「med.expiryDate」 是DateTime類型。 「med.expiryDate」將被封裝到freemarker.ext.beans.StringModel中,此後「med.expiryDate?date」將被解析使用freemarker.template.Configuration dateFormat。如果此dateFormat與DateTime.toString()的默認格式不同,可以引發異常。

要解決這個問題,您需要讓Freemarker明白DateTime同時也是一個日期,而不是一個字符串。寫下您的自定義對象wraper:

/** 
* Wrapper to make freemarker identify org.joda.time.DateTime objects as date. 
* User: evvo 
* Date: 5/26/2016 
* Time: 18:21 
*/ 
public class DateTimeAwareObjectWrapper extends DefaultObjectWrapper { 

    @Override 
    public TemplateModel wrap(Object obj) throws TemplateModelException { 
     if (obj instanceof DateTime) { 
     return new SimpleDate(((DateTime) obj).toDate(), getDefaultDateType()); 
     } 
     return super.wrap(obj); 
    } 
} 

,並將其設置爲freemarker的配置

configuration.setObjectWrapper(new DateTimeAwareObjectWrapper()); 

這種變化之後我相信後綴也將在日期時間表達式的工作?

相關問題