有沒有什麼方法可以輕鬆格式化Freemarker中的Joda DateTime對象?例如對於Java日期,我們可以使用?字符串和其他指令。Freemarker對JodaTime有任何整合嗎?
我知道我可以打電話給日期並獲得Java日期,但我希望有更好的方法。
有沒有什麼方法可以輕鬆格式化Freemarker中的Joda DateTime對象?例如對於Java日期,我們可以使用?字符串和其他指令。Freemarker對JodaTime有任何整合嗎?
我知道我可以打電話給日期並獲得Java日期,但我希望有更好的方法。
您應該能夠直接從Freemarker的調用toString(String pattern)
方法:
${dateTime.toString('MM-dd-yy')}
(未測試)
我不相信目前在Freemarker中有任何JodaTime的整合。將一個對象放入模型中進行格式化非常容易,例如:
使用格式(String pattern,DateTime dateTime)方法編寫一個類「MyCustomJodaFormatterBean」。把這個的一個實例放在根中。
root.put(「joda」,new MyCustomJodaFormatterBean());
在freemarker中
然後,
${joda.format("MM-dd-yyy", dateTime)}
甚至還有一個這樣做更簡單,如果你不想濺起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,但更容易編寫'if(obj instanceof LocalDate){return super.wrap(((LocalDate)obj).toDate()); }'。此外,'if(obj == null){...}'行是多餘的。 – antak 2014-07-21 04:48:34
在解析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());
這種變化之後我相信串後綴也將在日期時間表達式的工作?
太棒了,我是Joda的新手,沒有看到這個API。我認爲從我在Java日期世界的過去,我認爲它必須是很難的。 – Andy 2011-03-22 22:08:48