Freemarker에서 Joda DateTime 객체를 쉽게 포맷 할 수있는 방법이 있습니까? 예를 들어 Java 날짜의 경우? 문자열과 다른 지시문을 사용할 수 있습니다.Freemarker는 JodaTime과 통합되어 있습니까?
나는 toDate를 호출하고 Java Date를 얻을 수 있다는 것을 알고 있지만 더 나은 방법이 있기를 바랬습니다.
Freemarker에서 Joda DateTime 객체를 쉽게 포맷 할 수있는 방법이 있습니까? 예를 들어 Java 날짜의 경우? 문자열과 다른 지시문을 사용할 수 있습니다.Freemarker는 JodaTime과 통합되어 있습니까?
나는 toDate를 호출하고 Java Date를 얻을 수 있다는 것을 알고 있지만 더 나은 방법이 있기를 바랬습니다.
당신은 프리 마커에서 직접 toString(String pattern)
메소드를 호출 할 수 있어야한다 :
${dateTime.toString('MM-dd-yy')}
(테스트하지)
저는 현재 Freemarker에서 JodaTime에 대한 통합이 있다고 생각하지 않습니다. 형식으로 모델에 객체를 넣는 것은 매우 쉽습니다. 즉,
형식 (String pattern, DateTime dateTime) 형식으로 "MyCustomJodaFormatterBean"클래스를 작성하십시오. 이 인스턴스를 루트에 넣으십시오.
,root.put ("joda", new MyCustomJodaFormatterBean()); 프리 마커에서 다음
${joda.format("MM-dd-yyy", dateTime)}
심지어있다 너가 튀기고 싶지 않으면, 이것을하는 더 쉬운 방법 toString('MM-dd-yy')
은 모든 템플릿 위에 있습니다.
단순히 상자 밖으로 Joda 시간을 이해할 수 있도록, 프리 마커의 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);
}
}
당신이 당신의 프리 마커 엔진을 불 때 프리 마커의 설정이 객체 래퍼를 공급
Configuration config = // ...
config.setObjectWrapper(new JodaAwareObjectWrapper());
그런 다음 템플릿에 ${dateTime?date}
과 같은 FreeMarkers 표준 날짜 내장 기능을 사용할 수 있습니다.
+1, 쓰기가 쉬움 if (obj instanceof LocalDate) {return super.wrap (((LocalDate) obj) .toDate()); }'. 또한'if (obj == null) {...}'줄은 불필요합니다. – antak
FTL 파일을 구문 분석하는 동안 freemarker는 객체의 내부 모델을 만듭니다. 예를 들어, java.util.Date 식은 freemarker.template.SimpleDate에 래핑됩니다. 모델의 표현식 값이 org.joda.time.DateTime 유형 인 경우 - freemarker에 대해 알 수 없으므로 기본적으로 freemarker.ext.beans.StringModel으로 래핑되며 toString() 메서드를 사용하여 DateTime을 문자열로 변환합니다. .
예를 들어, 우리는 FTL 표현에 있다고 가정 같은 : "med.expiryDate는"타입의 날짜 시간이다
med.expiryDate?date <= today?date
. "med.expiryDate"는 freemarker.ext.beans.StringModel에 래핑되고 이후에는 "med.expiryDate? date"가 구문 분석됩니다. freemarker.template.Configuration
dateFormat. 이 dateFormat가 DateTime.toString()의 기본 형식과 다른 경우 예외가 발생합니다.
이 문제를 해결하려면 Freemarker가 DateTime이 문자열이 아닌 날짜이기도하다는 사실을 이해해야합니다.
/**
* 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);
}
}
을 내가 문자열 접미사는 날짜 시간 표현에서 작동합니다 보라 등 변경 후 프리 마커 구성
configuration.setObjectWrapper(new DateTimeAwareObjectWrapper());
로 설정 : 사용자 정의 개체 wraper 쓰기?.
너무 멋져요, 나는 Joda를 처음 접했고이 API를 보지 못했습니다. 나는 Java Date 세계에서 나의 옛날부터 나는 그것이 어려운 것이어야한다고 생각했다. – Andy