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

Java 8 Freemarker中的Java.time(Java8)支持,java-8,freemarker,Java 8,Freemarker,有人知道在FreeMarker中支持新java.time api的计划吗?或者有没有人编写代码来支持ZonedDateTime、LocalDateTime和Instant之类的类 我自己不难看出如何实施这些事情,但实际上这是一项相当大的任务 现在还没有人处理这个问题(2.3.24),尽管大家都知道它不见了。如果不将Java 8日期/时间类型降级为Java.util.date-s(当它们由TemplateDateModel返回时)是可以接受的,那么正确地执行这些操作可能不是件小事 顺便说一句,我已

有人知道在FreeMarker中支持新java.time api的计划吗?或者有没有人编写代码来支持ZonedDateTime、LocalDateTime和Instant之类的类


我自己不难看出如何实施这些事情,但实际上这是一项相当大的任务

现在还没有人处理这个问题(2.3.24),尽管大家都知道它不见了。如果不将Java 8日期/时间类型降级为
Java.util.date
-s(当它们由
TemplateDateModel
返回时)是可以接受的,那么正确地执行这些操作可能不是件小事


顺便说一句,我已经将其添加到,这样就不会忘记了。

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

  • 创建自定义方法:

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

    put(“formatDateTime”,新的FormatDateTimeMethodModel())

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

    ${formatDateTime(我的日期,'HH:mm')}


  • 你想用它做什么?谢谢你添加它。我认为降级到java.util.Date将是朝着错误方向迈出的一大步。源代码中的注释认为,很多日期复杂性是由于java.util.date没有一种只处理时间戳、日期等的好方法造成的。我正在开发一组新的TemplateModel和一个新的ObjectWrapper,它将支持所有java.time对象,并确保它们的格式正确。我想这是目前解决问题的唯一办法吧?当它准备好的时候,我会发布更多关于它的信息。我想我们可以在github上打开它。只是在contribution.html网站上的一个小错误。您编写了“对Java8数据/时间API-s的支持”。我猜您是在说“支持Java8日期/时间API-s”;)今晚,我在一个小型实现上做了一些初步工作。如果你有时间,我会喜欢你的评论:。也许有更好的办法?还是我现在走对了方向?直到我们有一个真正的实现计划,我的意思是。你会在这里找到一些测试:。如果您认为这是唯一/正确的方法,我将添加更多内容。为了让阅读本文的任何人都清楚,您可以直接使用
    Java.time
    类的Java API,就像其他在FTL的类型“system”中没有等价物的类一样。当然,您肯定需要一个比
    toString()返回的字符串值更好的字符串值,并添加一些格式化快捷方式。@Autowired private FormatDateTimeMethodModel fdtmm@ModelAttribute(“formatDateTime”)公共FormatDateTimeMethodModel formatDateTime(身份验证){return fdtmm;}如果您想在freemarker模板中使用它,请包含一个解释,说明如何以及为什么解决此问题会真正有助于提高您的文章质量,而且可能会得到更多的支持票。
    
    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());