在 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}
我有一个日期戳,应该很长,来自数据库。
我知道我需要将其转换为 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}