无法从模型模板呈现日期
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.Date
和 java.sql.Timestamp
和 java.sql.Timestamp
,没有这种歧义。 (不过要注意 Timestamp
的有趣小数秒处理。)
手动将值包装到TemplateDateModel
中,您可以在其中指定它是哪种类型的值。然后将 TemplateDateModel
放入数据模型中。
嗨,看!你可以这样尝试:
<td name="">${value.startTime?string('dd.MM.yyyy HH:mm:ss')}</td>
您可以将 value.startTime 替换为日期或时间戳类型的目标变量
我正在使用 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.Date
和java.sql.Timestamp
和java.sql.Timestamp
,没有这种歧义。 (不过要注意Timestamp
的有趣小数秒处理。)手动将值包装到
TemplateDateModel
中,您可以在其中指定它是哪种类型的值。然后将TemplateDateModel
放入数据模型中。
嗨,看!你可以这样尝试:
<td name="">${value.startTime?string('dd.MM.yyyy HH:mm:ss')}</td>
您可以将 value.startTime 替换为日期或时间戳类型的目标变量