我对这两个模板引擎有一个相当简单的问题。
我正在尝试确定未来/过去的日期,即从现在开始的固定时间,例如 18 个月前或明天。
我知道可以使用速度/freemarker 模板(类似于$date.add(2,-18)
)中的 java 日期对象来执行此操作,但我想使用DateTool或 freemarker 核心来执行此操作。
这在我看来是纯粹的展示(想想你在航班预订表格中看到的默认日期),所以我看不出模板引擎不能做到这一点的任何原因。
有可能吗?如果是这样,怎么做?
我对这两个模板引擎有一个相当简单的问题。
我正在尝试确定未来/过去的日期,即从现在开始的固定时间,例如 18 个月前或明天。
我知道可以使用速度/freemarker 模板(类似于$date.add(2,-18)
)中的 java 日期对象来执行此操作,但我想使用DateTool或 freemarker 核心来执行此操作。
这在我看来是纯粹的展示(想想你在航班预订表格中看到的默认日期),所以我看不出模板引擎不能做到这一点的任何原因。
有可能吗?如果是这样,怎么做?
我知道这个帖子真的很老了,但对于来自未来的人们仍在寻找答案:日期操作可以完成将日期转换为毫秒/从毫秒:
${(mydate?long - 18 * 86400000)?number_to_date?string("yyyy-MM-dd")}
例如将从中减去 18 天mydate
。(注意 86400000 是每天的毫秒数)
对于freemarker,也许是:日期的内置插件。
在 Velocity Tools 中没有这样的方法。
您也可以在 Velocity 中执行此操作,但不能使用 DateTool(无论如何它属于 Velocity Extras)。
拥有一个带有各种实用程序的“格式”对象是一个很好的做法,这些实用程序仅用于演示目的(您可以看到使用 Velocity 的各种框架如何拥有“格式”对象)。
因此,您的代码看起来像 $format.dateFromNow(),并且仍然是一种演示方法。
我发现根据@Stefan Haberl,?long
确实java.util.Date.getTime()
可以在日期上获得与a相同的值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
内置的
[#assign
nowAsUnix = convertToUnix(.now)
prettyDate = (nowAsUnix * 1000)?number_to_date
]
注意:我对编辑/改进持开放态度,因为我不确定为什么需要这么多¯\_(ツ)_/¯
您可以编写自己的方法在 FreeMarker 中使用:http: //freemarker.sourceforge.net/docs/pgui_datamodel_method.html
构建一个执行此逻辑的 DataAddMethod。