2011-03-09 2 views
3

Freemarker에서 Joda DateTime 객체를 쉽게 포맷 할 수있는 방법이 있습니까? 예를 들어 Java 날짜의 경우? 문자열과 다른 지시문을 사용할 수 있습니다.Freemarker는 JodaTime과 통합되어 있습니까?

나는 toDate를 호출하고 Java Date를 얻을 수 있다는 것을 알고 있지만 더 나은 방법이 있기를 바랬습니다.

답변

8

당신은 프리 마커에서 직접 toString(String pattern) 메소드를 호출 할 수 있어야한다 :

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

(테스트하지)

+0

너무 멋져요, 나는 Joda를 처음 접했고이 API를 보지 못했습니다. 나는 Java Date 세계에서 나의 옛날부터 나는 그것이 어려운 것이어야한다고 생각했다. – Andy

3

저는 현재 Freemarker에서 JodaTime에 대한 통합이 있다고 생각하지 않습니다. 형식으로 모델에 객체를 넣는 것은 매우 쉽습니다. 즉,

형식 (String pattern, DateTime dateTime) 형식으로 "MyCustomJodaFormatterBean"클래스를 작성하십시오. 이 인스턴스를 루트에 넣으십시오.

root.put ("joda", new MyCustomJodaFormatterBean()); 프리 마커에서 다음

,

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

심지어있다 너가 튀기고 싶지 않으면, 이것을하는 더 쉬운 방법 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

+1, 쓰기가 쉬움 if (obj instanceof LocalDate) {return super.wrap (((LocalDate) obj) .toDate()); }'. 또한'if (obj == null) {...}'줄은 불필요합니다. – antak

2

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 쓰기?.

관련 문제