Freemarker/Velocity - 日期操作

4
我有一个关于这两个模板引擎的相当简单的问题。
我想要创建一个从现在开始的固定时间,比如18个月前或明天。
我知道可以在velocity/freemarker模板中使用java日期对象来实现这一点(类似于$date.add(2,-18)),但我想使用DateTool或freemarker core来实现。
这是我认为纯粹呈现的内容(只需考虑您在预订航班表单中看到的默认日期),因此我看不出为什么模板引擎不能做到这一点。
不过,是否可能?如果可能,怎么做?
7个回答

10

我知道这篇文章已经很老了,但是对于仍在寻找答案的未来人,日期操作可以通过将日期转换为/从毫秒进行:

${(mydate?long - 18 * 86400000)?number_to_date?string("yyyy-MM-dd")}
例如,将18天从mydate中减去。(注意86400000是每天的毫秒数)

需要注意的一点是:?long 不是一个文档化的日期内置函数,它在专家内置函数页面上可以找到:https://freemarker.apache.org/docs/ref_builtins_expert.html - joshwhatk

2
我发现根据@Stefan Haberl的说法,?long 可以 用于日期,以获得与java.util.Date.getTime()相同的值作为Long。然而,我需要更多的解释才能比较日期或修改日期。
以下是要点:
  1. ?long = java.util.Date.getTime() 返回以毫秒为单位的纪元时间
  2. 此时,您可以从该数字中加减任意数量的毫秒进行操作
我喜欢使用秒而不是毫秒进行操作(零更少,我不在乎毫秒等),如下所示:
[#function convertToUnix date]
  [#return (date?date?long / 1000)]
[/#function]

[#-- Output Unix Timestamp --]
${convertToUnix(.now)}

此时,86400代表1天(因为我们现在是以“秒”为单位),所以您可以简单地添加/减去该值来操作日期。最初的回答。
[#assign
  day = 86400
  week = 7 * day
  avgMonth = 365.25 / 12 * day

  testingEndOfDay = convertToUnix(.now) < (convertToUnix(sameDay) + day)
  testingYesterday = convertToUnix(.now) < (convertToUnix(yesterday) + day)
]
${testingEndOfDay?c} # true, .now is less than the end of the day
${testingYesterday?c} # false, .now is greater than the end of yesterday

注意:我不计较时间,我们收到的日期始于凌晨12点,并且想要检查它是否等于.now当天结束时的时间。现在,如果我想要将Unix格式(以秒为单位)的日期转换回来,我可以使用
?number_to_date内置函数进行转换。最初的回答。
[#assign
  nowAsUnix = convertToUnix(.now)
  prettyDate = (nowAsUnix * 1000)?number_to_date
]

Note: 我很乐意接受编辑/改进,因为我不确定为什么需要这么多¯\_(ツ)_/¯

最初的回答

1

我已经看过那个文档页面,但是我找不到任何有关日期操作的参考,只有如何格式化日期的内容,也许我错过了吗? - Razor
抱歉,我认为你需要自己编写freemarker TemplateMethodModelEx...请参考此帖子:在http://thread.gmane.org/gmane.comp.web.freemarker.user/4292上计算两个日期之间的天数。 - Istao
这与我所需的不同,但与velocity工具相比,它似乎没有更好的日期操作可能性。我猜想使用这个引擎也无法满足我的需求。 - Razor

1
在Velocity Tools中没有这样的方法。

1

你也可以在Velocity中做到这一点,但不能使用DateTool(它属于Velocity Extras)。

拥有一个“格式”对象并具有各种仅用于呈现目的的实用程序是一个好习惯(您可以看到使用Velocity的各种框架如何拥有“格式”对象)。

因此,您的代码将类似于$format.dateFromNow(),并且仍将具有呈现方法。


0

万一有人需要帮助,我在这里发布我的Freemarker结果,基于之前的答案:

<#function minusSeconds date, numSec >
    <#return (date?long - numSec * 1000)?number_to_datetime?iso_utc
</#function>

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接