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

时间:2015-07-25 20:28:19

标签: velocity

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

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

如果这是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)似乎返回null,MathUtil不会让我到处都是因为它有转换为整数和双精度但不长的方法。

2 个答案:

答案 0 :(得分:2)

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

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

然后在你的模板中

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

答案 1 :(得分:0)

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

初始化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包含字符串,长值(自纪元以来的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具有正确的值。