有人知道在FreeMarker中支持新的java.time api的计划吗?或者是否有任何代码可用于支持ZonedDateTime,LocalDateTime和Instant?
等类我自己不难看出如何实现这些东西,但实际上这是一项相当大的任务。
答案 0 :(得分:5)
假设您想要格式化新的日期/时间对象
创建自定义方法:
public static class FormatDateTimeMethodModel
implements TemplateMethodModelEx {
public Object exec(List args) throws TemplateModelException {
if (args.size() != 2) {
throw new TemplateModelException("Wrong arguments");
}
TemporalAccessor time = (TemporalAccessor) ((StringModel) args.get(0)).getWrappedObject();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(((SimpleScalar) args.get(1)).getAsString());
return formatter.format(time);
}
}
将此方法放入模板模型中:
templateModel.put(“formatDateTime”,new FormatDateTimeMethodModel());
并在模板中调用此方法:
$ {formatDateTime(MY_DATE,'HH:mm')}
答案 1 :(得分:2)
现在没有人处理这个问题(2.3.24),尽管已知它会丢失。除非将{8}的{8}日期/时间类型降级为java.util.Date
,否则可能无法正常执行。
顺便说一下,我已将其添加到http://freemarker.org/contribute.html,因此不会被遗忘。
答案 2 :(得分:0)
private static class CustomObjectWrapper extends DefaultObjectWrapper {
@Override
public TemplateModel wrap(Object obj) throws TemplateModelException {
if (obj instanceof LocalDateTime) {
Timestamp timestamp = Timestamp.valueOf((LocalDateTime) obj);
return new SimpleDate(timestamp);
}
if (obj instanceof LocalDate) {
Date date = Date.valueOf((LocalDate) obj);
return new SimpleDate(date);
}
if (obj instanceof LocalTime) {
Time time = Time.valueOf((LocalTime) obj);
return new SimpleDate(time);
}
return super.wrap(obj);
}
}
@Autowired
private freemarker.template.Configuration configuration;
configuration.setObjectWrapper(new CustomObjectWrapper());