Java 8 Freemarker中的Java.time(Java8)支持
有人知道在FreeMarker中支持新java.time api的计划吗?或者有没有人编写代码来支持ZonedDateTime、LocalDateTime和Instant之类的类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返回时)是可以接受的,那么正确地执行这些操作可能不是件小事 顺便说一句,我已
我自己不难看出如何实施这些事情,但实际上这是一项相当大的任务 现在还没有人处理这个问题(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);
}
}
你想用它做什么?谢谢你添加它。我认为降级到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());