在Freemarker中,我可以使用.now?time
来获取当前时间,但如何将其与另一时间进行比较?
例如,如何正确测试当前时间是否在上午8:00到下午5:00之间?
<#if .now?time gte (?) && .now?time lte (?)>
//do something
<#/if>
我不知道在(?)中放入什么,因为我不确定如何在Freemarker中创建日期标量。
答案 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。