Freemarker/Velocity - 日期操作

Posted

技术标签:

【中文标题】Freemarker/Velocity - 日期操作【英文标题】:Freemarker/Velocity - date manipulation 【发布时间】:2011-02-06 04:46:04 【问题描述】:

我对这两个模板引擎有一个相当简单的问题。 我正在尝试制定未来/过去的日期,从现在开始的固定时间,例如18 个月前,或者明天。

我知道可以使用velocity/freemarker 模板(类似于$date.add(2,-18))中的java 日期对象来执行此操作,但我想使用DateTool 或freemarker 核心来执行此操作。

我认为这纯粹是展示性的(想想您在航班预订表格中看到的默认日期),所以我看不出模板引擎不能做到这一点的任何原因。

这可能吗?如果有,怎么做?

【问题讨论】:

【参考方案1】:

对于 freemarker,也许是:Built-ins for dates。

【讨论】:

我已经看过那个文档页面,我找不到任何关于日期操作的参考,只是如何格式化它们,也许我错过了? 抱歉,我认为您需要为此编写自己的 freemarker TemplateMethodModelEx...请参阅这篇文章:在thread.gmane.org/gmane.comp.web.freemarker.user/4292计算两个日期之间的天数 这与我需要的有所不同,但与速度工具相比,freemarker 似乎没有更好的日期操作可能性。我在这里猜测,用这个引擎也不能做我需要的事情。【参考方案2】:

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

【讨论】:

【参考方案3】:

您也可以在 Velocity 中执行此操作,但不能使用 DateTool(无论如何它属于 Velocity Extras)。

使用各种实用程序的“格式”对象是一种很好的做法,这些实用程序仅用于演示目的(您可以看到使用 Velocity 的各种框架如何拥有“格式”对象)。

因此您的代码看起来像 $format.dateFromNow(),并且仍然是一种演示方法。

【讨论】:

【参考方案4】:

您可以编写自己的方法在 FreeMarker 中使用: http://freemarker.sourceforge.net/docs/pgui_datamodel_method.html

构建一个执行此逻辑的 DataAddMethod。

【讨论】:

【参考方案5】:

我知道这篇文章真的很老了,但对于来自未来的人们仍在寻找答案:可以完成日期操作,将日期转换为毫秒:

$(mydate?long - 18 * 86400000)?number_to_date?string("yyyy-MM-dd")

例如会从mydate 中减去 18 天。 (注意86400000是每天的毫秒数)

【讨论】:

需要注意的一点:?long 不是内置的记录日期,它在专家内置页面上:freemarker.apache.org/docs/ref_builtins_expert.html【参考方案6】:

我发现每个@Stefan Haberl,?long does work on dates to get the same value as java.util.Date.getTime()Long。但是,我需要更多解释才能比较日期或修改日期。

这里是要点:

    ?long = java.util.Date.getTime() 以毫秒为单位返回纪元时间 此时,您可以从该数字中添加/减去任意数量的毫秒以进行操作

我喜欢以秒而不是毫秒为单位工作(减少不必要的零,我不关心毫秒等),看起来像这样:

[#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:00 开始的日期,并想检查 .now 以了解一天的结束。

现在,如果我想从 Unix 格式(以秒为单位)返回日期,我可以使用 ?number_to_date builtin 将其转换回来

[#assign
  nowAsUnix = convertToUnix(.now)
  prettyDate = (nowAsUnix * 1000)?number_to_date
]

注意:我对编辑/改进持开放态度,因为我不确定为什么需要这样做¯\_(ツ)_/¯

【讨论】:

以上是关于Freemarker/Velocity - 日期操作的主要内容,如果未能解决你的问题,请参考以下文章

JSP FreeMarker Velocity 原理

大数据学习总结记录—页面静态化技术(Freemarker/velocity)& 网站伪静态(UrlRewriteFilter)

学习笔记初识FreeMarker简单使用

表现层 FreeMarker与JSP

jsp

Jsp学习总结