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

Jak*_*sen 6 freemarker java-8

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

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

jnr*_*jnr 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);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将此方法放入模板模型:

    templateModel.put(“ formatDateTime”,新的FormatDateTimeMethodModel());

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

    $ {formatDateTime(MY_DATE,'HH:mm')}


dde*_*any 3

目前没有人处理这个问题(2.3.24),尽管已知它丢失了。正确执行可能并不简单,除非java.util.Date在返回时将 Java 8 日期/时间类型降级为 -sTemplateDateModel是可以接受的。

顺便说一句,我已将其添加到http://freemarker.org/contribute.html,这样就不会被忘记。

  • 今晚我已经完成了一些小型实施的初步工作。如果您有时间,我会喜欢您的评论:https://github.com/amedia/freemarker-java-8。也许有更好的方法?或者我现在走在正确的道路上吗?我的意思是,直到我们制定出真正实施的计划为止。 (3认同)
  • 感谢添加它。我认为降级到 java.util.Date 将是朝着错误方向迈出的一大步。源代码中的注释认为,许多日期复杂性是由于 java.util.Date 没有一个好的方法来仅处理时间戳、日期等造成的。我正在开发一组新的 TemplateModel 和一个新的 ObjectWrapper,它将支持所有 java.time 对象并确保它们的格式正确。我想这是目前解决问题的唯一方法吗?准备好后我会发布更多有关它的信息。我想我们可以在 github 上打开它。 (2认同)
  • 您会在这里找到一些测试:https://github.com/amedia/freemarker-java-8/blob/master/src/test/resources/no/api/freemarker/java8/time/datetime.feature。如果您认为这是唯一/正确的方法,我会添加更多内容。 (2认同)