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

Groovy 无法从模型模板呈现日期,groovy,freemarker,Groovy,Freemarker,我正在使用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} : ${

我正在使用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(值为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引擎:如果我运行相同的数据模型和模板,我收到的输出是:
2015年8月20日

有人能指出我哪里出了问题吗?我希望像在线引擎那样渲染输出

谢谢你的改变

new StringReader("${someDate}")

双引号可能会导致双回火问题(如错误消息所述)是技术上不可能确定
java.util.Date
是仅代表日期、日期时间还是仅代表时间值。这是一个不属于FreeMarker的技术事实。FreeMarker提供了以下处理此问题的方法:

  • 使用
    ?date
    ?time
    ?datetime
    运算符在模板中为FreeMarker提供提示。见:

  • 使用
    java.sql.Date
    java.sql.Timestamp
    java.sql.Timestamp
    ,这样就不会产生歧义。(注意
    时间戳
    的有趣的分数秒处理。)

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


  • 你好,看!您可以这样尝试:

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

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

    谢谢Tim,但这并没有解决我的问题。实际上,我的代码是从另一个变量获取模板的,所以它更像这个StringReader(myVar),但我确实将它更改为您特别提到的内容,并放弃了该变量,它仍然产生了相同的错误。
    <td name="">${value.startTime?string('dd.MM.yyyy HH:mm:ss')}</td>