用过freemaker的同志可能都遇到过这个问题,但不一定知道原因。毕竟都是踩过坑的人,还是要分享点干货出来避免大家掉一个坑里。
一、问题如何出现?
这是在接通微信公众号向粉丝推送消息时出现的问题。微信有多少坑我就不一一细说了。(ps:并没有黑我大腾讯)。
通过获取successToken,然后用successToken获取粉丝信息。返回值中有一个字段:
subscribe_time,这个是mysql表字段中的命名,我为了方便解析直接用了varchar类型,实体类为String。(并没有考虑到需要将字段使用freemaker显示到页面)。然后用普通的方式渲染数据。结果异常开始。
解决方案:
一、${*****?string("yyyy-MM-dd HH:mm:ss")}
这种类型只能用在处理"2017-08-20 20:19:01",是整个String类型。
结果:
freemaker抛出异常。。
二、${**.**?date};${**.**?datetime}
结果还是一样。。。怎么办,我们来分析原因:
首先 String str="1501640352",他是时间戳类型,我尝试先将其转换为long类型:
<#assign dlong = u.subscribe_time?number/>
${u.subscribe_time?number_to_datetime!}
如果看不懂assign的同学请自行百度。
打印出来看下这样:
这次没有抛出异常,但结果是1970····
这样就有点尴尬了。。。把时间戳拿去站长工具里面转换又是2017····
再细想一下,如果是unix生成的时间戳是精确到秒级的,而java是精确到毫秒级的,如果我将时间戳转为long再*1000是否有效?实验:
<#assign dlong = u.subscribe_time?number * 1000 />
${dlong?number_to_datetime}
结果:
2017····
大功告成!
其实freemaker很强大的,可以在.java文件里定义方法然后通过配置文件调用。必要时可以配置一下调用后台的方法