Freemarker中的Java.time(Java 8)支持

时间:2015-08-18 03:55:55

标签: java-8 freemarker

有人知道在FreeMarker中支持新的java.time api的计划吗?或者是否有任何代码可用于支持ZonedDateTime,LocalDateTime和Instant?

等类

我自己不难看出如何实现这些东西,但实际上这是一项相当大的任务。

3 个答案:

答案 0 :(得分:5)

假设您想要格式化新的日期/时间对象

  1. 创建自定义方法:

    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);
        }
    }
    
  2. 将此方法放入模板模型中:

    templateModel.put(“formatDateTime”,new FormatDateTimeMethodModel());

  3. 并在模板中调用此方法:

    $ {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());