Freemarker / Velocity - 日期操作

时间:2010-04-09 14:56:50

标签: java velocity freemarker

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

我知道可以使用速度/自由标记模板中的java日期对象(类似$date.add(2,-18))来执行此操作,但我希望使用DateTool或freemarker核心执行此操作。

我认为这是纯粹的表现形式(只是想想你在飞行预订表格中看到的默认日期),所以我看不出为什么模板引擎不应该这样做的原因。

虽然可以吗?如果是这样,怎么样?

6 个答案:

答案 0 :(得分:4)

我知道这篇帖子真的很旧,但对于未来的人们仍在寻找答案:日期操作可以将日期转换为/从毫秒开始:

${(mydate?long - 18 * 86400000)?number_to_date?string("yyyy-MM-dd")}
例如,

将从mydate减去18天。 (请注意,86400000是每天的毫秒数)

答案 1 :(得分:1)

对于freemarker,可能是:Built-ins for dates

答案 2 :(得分:1)

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

答案 3 :(得分:1)

您也可以在Velocity中进行,但不能使用DateTool(无论如何都属于Velocity Extras)。

最好使用具有各种实用程序的“Format”对象,这些实用程序仅用于表示目的(您可以看到使用Velocity的各种框架如何使用“Format”对象)。

因此,您的代码看起来像$ format.dateFromNow(),并且仍然会有一个表示方法。

答案 4 :(得分:1)

我发现根据@Stefan Haberl的说法,?long does work on dates to get the same value as 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:00 AM,并希望在一天结束时检查.now

现在,如果我想从Unix格式中获取日期(以秒为单位),可以使用?number_to_date builtin

将其转换回来。
[#assign
  nowAsUnix = convertToUnix(.now)
  prettyDate = (nowAsUnix * 1000)?number_to_date
]

注意:由于不确定为什么需要很多修改,我愿意接受编辑/改进。\ _(ツ)_ /¯

答案 5 :(得分:0)

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

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