AEM HTL / Sightly 日期格式化程序中需要的日期类型

ron*_*onx 3 format date aem sightly htl

我已经看到,从 AEM 6.3 开始,标记本身就支持日期格式,如下所示:

${ 'dd~MMMM-yyyy' @ format=currentPage.jcr:created }
Run Code Online (Sandbox Code Playgroud)

(参考:https : //github.com/adobe/htl-spec/blob/master/SPECIFICATION.md#1222-dates

我尝试使用该 jcr:created 属性以及来自后端的数据来玩这个格式化程序java.util.Date

我的问题是,是否支持其他日期类型?比如说,java.time.LocalDate?它没有显示在我的测试页面上,虽然我不确定我是否只是缺少一些需要在 HTL 标记上指出的附加属性?

ton*_*edz 5

据我所知,文档中没有提到它,但 Apache Sling 是一个开源项目,因此我们可以自行查找。

综观实施细则,唯一支持的类型,现在是java.util.Datejava.util.Calendar及其子类。

这是负责在 HTL 中应用所选格式的FormatFilterExtension

让我们来看看它执行的检查。

 } else if (DATE_FORMAT_TYPE.equals(formattingType) || (!hasPlaceHolders && runtimeObjectModel.isDate(formatObject))) {
      Locale locale = getLocale(runtimeObjectModel, options);
      TimeZone timezone = getTimezone(runtimeObjectModel, options);
      return formatDate(source, runtimeObjectModel.toDate(formatObject), locale, timezone);
 }
Run Code Online (Sandbox Code Playgroud)

它用于runtimeObjectModel.isDate()验证我们是否正在处理日期。如果我们查看runtimeObjectModel,我们可以看到它是一个实例,SlingRuntimeObjectModel它又扩展了AbstractRuntimeModel

@Override
public boolean isDate(Object target) {
    return (target instanceof Date || target instanceof Calendar);
}
Run Code Online (Sandbox Code Playgroud)

所以如果它是 aDate或 a Calendar,它将被处理。

即使你像这样强制格式化类型

${'yyyy-MM-dd' @ format=myDate, type='date'} <!--/* Forced formatting type */-->
Run Code Online (Sandbox Code Playgroud)

您传递的对象最终将使用AbstractRuntimeObjectModel#toDate(Object object)whichnull为不是Dateor实例的所有对象返回处理Calendar

由于检查基于instanceof,这也包括DateCalendar的子类型的实例。LocalDate但是,不是其中之一,因此它不起作用也就不足为奇了。