我正在使用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
有谁可以指出我哪里出错了?我想像在线引擎一样呈现输出。
由于
答案 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.Date
和java.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,即日期或时间戳类型