AEM HTL / Sightly 日期格式化程序中需要的日期类型
Date type required in AEM HTL / Sightly date formatter
我发现自 AEM 6.3 以来,标记中已原生支持日期格式,如下所示:
${ 'dd~MMMM-yyyy' @ format=currentPage.jcr:created }
(参考:https://github.com/adobe/htl-spec/blob/master/SPECIFICATION.md#1222-dates)
我试过使用 jcr:created 属性 以及来自 java.util.Date
后端的数据来玩这个格式化程序。
我的问题是,是否支持 其他 日期类型?比如,java.time.LocalDate
?它没有显示在我的测试页上,尽管我不确定我是否只是缺少一些需要在 HTL 标记上指明的额外 属性?
据我所知,文档中并未提及它,但 Apache Sling 是一个开源项目,因此我们可以自行查找。
查看实现细节,目前唯一支持的类型是 java.util.Date
和 java.util.Calendar
及其子类型 类。
FormatFilterExtension
class 负责在 HTL 中应用所选格式。
让我们看看它执行的检查。
} 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);
}
它使用 runtimeObjectModel.isDate()
来验证我们是否正在处理日期。如果我们查看 runtimeObjectModel
,我们可以看到它是 SlingRuntimeObjectModel
which in turn extends AbstractRuntimeModel
.
的一个实例
@Override
public boolean isDate(Object target) {
return (target instanceof Date || target instanceof Calendar);
}
因此,如果它是 Date
或 Calendar
,它将被处理。
即使你像这样强制格式化类型
${'yyyy-MM-dd' @ format=myDate, type='date'} <!--/* Forced formatting type */-->
您传递的对象最终将使用 AbstractRuntimeObjectModel#toDate(Object object)
处理,其中 returns null
对于不是 Date
或 [=21= 实例的所有对象].
由于检查是基于 instanceof
,这也包括 Date
和 Calendar
的子类型的实例。然而,LocalDate
不是其中之一,因此它不起作用也就不足为奇了。
我发现自 AEM 6.3 以来,标记中已原生支持日期格式,如下所示:
${ 'dd~MMMM-yyyy' @ format=currentPage.jcr:created }
(参考:https://github.com/adobe/htl-spec/blob/master/SPECIFICATION.md#1222-dates)
我试过使用 jcr:created 属性 以及来自 java.util.Date
后端的数据来玩这个格式化程序。
我的问题是,是否支持 其他 日期类型?比如,java.time.LocalDate
?它没有显示在我的测试页上,尽管我不确定我是否只是缺少一些需要在 HTL 标记上指明的额外 属性?
据我所知,文档中并未提及它,但 Apache Sling 是一个开源项目,因此我们可以自行查找。
查看实现细节,目前唯一支持的类型是 java.util.Date
和 java.util.Calendar
及其子类型 类。
FormatFilterExtension
class 负责在 HTL 中应用所选格式。
让我们看看它执行的检查。
} 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);
}
它使用 runtimeObjectModel.isDate()
来验证我们是否正在处理日期。如果我们查看 runtimeObjectModel
,我们可以看到它是 SlingRuntimeObjectModel
which in turn extends AbstractRuntimeModel
.
@Override
public boolean isDate(Object target) {
return (target instanceof Date || target instanceof Calendar);
}
因此,如果它是 Date
或 Calendar
,它将被处理。
即使你像这样强制格式化类型
${'yyyy-MM-dd' @ format=myDate, type='date'} <!--/* Forced formatting type */-->
您传递的对象最终将使用 AbstractRuntimeObjectModel#toDate(Object object)
处理,其中 returns null
对于不是 Date
或 [=21= 实例的所有对象].
由于检查是基于 instanceof
,这也包括 Date
和 Calendar
的子类型的实例。然而,LocalDate
不是其中之一,因此它不起作用也就不足为奇了。