在 Velocity 模板中将 ms 自纪元时间戳转换为 Date

Converting ms since epoch timestamp to Date in Velocity templates

我有一个日期戳,应该很长,来自数据库。

我知道我需要将其转换为 Date,然后使用日期格式化程序输出正确的格式,但我正在努力解决如何(在 Velocity 模板-ese 中)将时间戳转换为一个约会。

如果这是 java,我通常会这样做:Date d = new Date(msSinceEpoch)。 Velocity 的等价物是什么?

这是我现在正在做的事情:

#set ( $date = $!n.myObj.getProperty('createdOn', 0) ))
#set ( $dateFormat = $dateTool.getDateFormat("yyyy-MM-dd H:m:s", $dateTool.getLocale(), $dateTool.getTimeZone()) )
#set ( $d2 = $dateFormat.parse($date) )
#set ( $display = $dateTool.format('medium', $d2) )

此方法抛出异常:

class java.text.SimpleDateFormat threw exception java.text.ParseException: Unparseable date: "1429891200000"

我猜这是因为日期是字符串,而不是 Long。尝试 $Long.parseLong($date) 似乎 return 为 null,而 MathUtil 并没有带我到任何地方,因为它有转换为整数和双精度的方法,但不是 long。

我找到的解决方案并不完美,但它确实有效。在调查了所有各种工具之后,我在模板语言或提供的工具中根本找不到任何可以完成工作的东西,但这种方法有效。

在初始化 Velocity 时,我创建了一个添加我需要的方法的新对象:

public class AugmentedDateTool extends DateTool { 
    public Date epochToDate(String msSinceEpoch) { return new Date(Long.parseLong(msSinceEpoch)); }
}

(注意我骑在 DateTool 之上,这似乎是该功能所属的地方,但缺少)

然后,我将其添加到上下文中:

VelocityContext context = new VelocityContext();
context.put("dateTool", new AugmentedDateTool());

然后,在模板内部,解决方案就变得简单了。给定 $timestamp 其中包含一个字符串,一个 long 值(自纪元以来的 ms),会发生这种情况:

#set ( $dateFormat = $dateTool.getDateFormat("yyyy-MM-dd H:m:s", $dateTool.getLocale(), $dateTool.getTimeZone()) )
#set ( $date = $dateTool.epochToDate($timestamp) )
#set ( $date = $dateTool.format('medium', $date))

然后结果 $date 具有正确的值。

我刚刚做了这个。最简单的方法是在您的上下文中放置一个新的 Date 对象,然后使用该对象的 setTime 方法并使用您的 long 作为参数。

VelocityContext context = new VelocityContent();
context.put("date", new Date());

然后在您的模板中

$date.setTime($unixTime)
Here is your date: ${date}