我有一个日期戳,应该很长,来自数据库。
我知道我需要将其转换为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
不会让我到处都是因为它有转换为整数和双精度但不长的方法。
答案 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
具有正确的值。