在 Freemarker 中,我可以使用
.now?time
获取当前时间,但我如何将它与另一个时间进行比较?
例如,如果当前时间在上午 8:00 到下午 5:00 之间,我该如何正确测试?
<#if .now?time gte (?) && .now?time lte (?)>
//do something
<#/if>
我不知道在 (?) 中放什么,因为我不确定如何在 Freemarker 中创建日期标量。
尽管您可以比较两个
java.util.Date
-s,只要它们是同类的(比如都是时间值),那么您需要确保内部表示一致(例如时间值)值在纪元日 VS 其他日期)。因此,它主要用于比较不存在此类问题的日期时间值(时间戳)。所以,既然你知道你想要一个基于纪元的时间,你可以做以下 hack:
<#assign nowTime = .now?time?string.iso?time.iso>
现在它可以正确地与
"8:00:00 AM"?time
进行比较,但是,我建议使用ISO格式,因为特定于语言环境的格式有点脆弱(比如如果你改变语言环境,它就不会工作):'08:00:00'?time.iso
。请注意,为此您至少需要 FreeMarker 2.3.21.
看了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代码中进行比较。
尝试 compareTo() 函数:
如果日期早,则返回负数;如果日期晚,则返回正数;如果日期相等,则返回零。
<#assign time1 = "11:55:00"?time>
<#assign time2 = "11:56:00"?time>
${dateUtil.compareTo(time1, time2)} <#-- Return -1 -->
${dateUtil.compareTo(time2, time1)} <#-- Return 1 -->
${dateUtil.compareTo(time1, time1)} <#-- Return 0 -->