如何在freemarker中比较时间?

问题描述 投票:0回答:3

在 Freemarker 中,我可以使用

.now?time
获取当前时间,但我如何将它与另一个时间进行比较?

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

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

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

java freemarker
3个回答
2
投票

尽管您可以比较两个

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.


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代码中进行比较。


0
投票

尝试 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 -->
© www.soinside.com 2019 - 2024. All rights reserved.