如何比较freemarker的时间?

时间:2014-10-21 03:18:52

标签: java freemarker

在Freemarker中,我可以使用.now?time来获取当前时间,但如何将其与另一时间进行比较?

例如,如何正确测试当前时间是否在上午8:00到下午5:00之间?

<#if .now?time gte (?) && .now?time lte (?)>
  //do something
<#/if>

我不知道在(?)中放入什么,因为我不确定如何在Freemarker中创建日期标量。

2 个答案:

答案 0 :(得分:2)

我阅读了freemarker 2.3.21的来源,发现当前的freemarker不支持比较.now?time和时间对象,例如"8:00:00 AM"?time

这是因为.now?time被内部视为当前时间,例如2014-10-21 15:11:30"8:00:00 AM"?time被视为1970-01-01 08:00:00

因此,<#if .now?time gte "8:00:00 AM"?time >始终为真。

如果您认为这是一个错误,您可以向http://sourceforge.net/p/freemarker/bugs/报告或在freemarker的邮件列表中发送问题。

所以当前的解决方法是创建Date对象并在java代码中进行比较。

答案 1 :(得分:2)

虽然你可以比较两个java.util.Date - s,因为它们都是同一种类型(比如两者都只是时间值),那么你应该确保内部表示是一致的(比如只有时间的值是在其他某一天的时间段VS中。因此,它主要用于比较不存在此类问题的日期时间值(时间戳)。所以,既然你知道你想要一个基于纪元的时间,你可以做以下的黑客攻击:

<#assign nowTime = .now?time?string.iso?time.iso>

现在它与"8:00:00 AM"?time正确匹配,但是,我建议使用ISO格式,因为特定于语言环境的格式有点脆弱(如果更改语言环境,它将无效):{{1} }。请注意,为此您至少需要FreeMarker 2.3.21。