无法从模型模板中呈现日期

时间:2015-08-20 16:50:06

标签: groovy freemarker

我正在使用Freemarker开发Grails项目,但我无法从数据模型中呈现日期。我开始在模型中添加日期

def dataModel = [:]
def dataDate = new Date().parse("yyyy-MM-dd","2015-08-20")
dataModel.put("someDate",dataDate)

然后我遍历dataModel以验证数据类型

dataModel.each { name, value ->
    println "${name} : ${value} (Value is type: ${value.getClass()})"
}

为此,我的输出是:someDate : Thu Aug 20 00:00:00 CDT 2015 (Value is type: class java.util.Date)

接下来,我设置了我的配置并尝试处理模板

Configuration cfg = new Configuration(Configuration.VERSION_2_3_22)
cfg.setDefaultEncoding("UTF-8")
def ftlTemplate = new Template("name", new StringReader("${someDate}"), cfg)
Writer out = new StringWriter()
ftlTemplate.process(dataModel, out)
output = out.toString()

此时我收到以下错误

ERROR freemarker.runtime  - Error executing FreeMarker template
Message: Can't convert the date-like value to string because it isn't known if it's a date (no time part), time or date-time value.
The blamed expression:
==> someDate  [in template "name" at line 1, column 3]

我在这里找到了一个Freemarker引擎:http://freemarker-online.kenshoo.com/如果我运行相同的数据模型和模板,我收到的输出是:Aug 20, 2015

有谁可以指出我哪里出错了?我想像在线引擎一样呈现输出。

由于

3 个答案:

答案 0 :(得分:2)

更改

new StringReader("${someDate}")

new StringReader('${someDate}')

双引号可能导致双重回火

答案 1 :(得分:2)

问题是(正如错误消息所述),如果java.util.Date代表仅限日期,日期时间或仅限时间的值,则在技术上一般无法决定。这是FreeMarker之外的技术事实。 FreeMarker提供了解决此问题的方法:

  • 使用?date?time?datetime运算符为FreeMarker提供模板提示。请参阅:http://freemarker.org/docs/ref_builtins_date.html#ref_builtin_date_datetype

  • 使用java.sql.Datejava.sql.Timestamp以及java.sql.Timestamp,其中没有这种歧义。 (请注意Timestamp有趣的第二部分处理。)

  • 将值手动包装到TemplateDateModel,您可以在其中指定它的值。然后将TemplateDateModel放入数据模型中。

答案 2 :(得分:-1)

嗨,你看!您可以尝试这些:

<td name="">${value.startTime?string('dd.MM.yyyy HH:mm:ss')}</td>

您可以将value.startTime替换为目标varibale,即日期或时间戳类型

相关问题