无法从模型模板呈现日期

Unable to render date from model template

我正在使用 Freemarker 进行 Grails 项目,但在从数据模型中呈现日期时遇到问题。我开始在模型中放置一个日期

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

然后我循环遍历数据模型以验证数据类型

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

谁能指出我哪里出错了?我想像在线引擎那样渲染输出。

谢谢

改变

new StringReader("${someDate}")

new StringReader('${someDate}')

双引号可能导致双重回火

问题是(如错误消息所述),技术上无法确定 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.Timestampjava.sql.Timestamp,没有这种歧义。 (不过要注意 Timestamp 的有趣小数秒处理。)

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

嗨,看!你可以这样尝试:

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

您可以将 value.startTime 替换为日期或时间戳类型的目标变量