#1. FreeMarker中的日期时间格式设置 FreeMarker中能够分别对date、time、datetime三种类型的日期时间设置格式,例如:java
config.setDateTimeFormat("yyyy-MM-dd HH:mm:ss"); config.setDateFormat("yyyy-MM-dd"); config.setTimeFormat("HH:mm:ss");
当咱们对一个页面变量使用 ?date
?time
?datetime
时就会分别按以上设置的对应格式显示。sql
#2. 什么状况下能够不使用 ?date
?time
?datetime
FreeMarker会将 java.sql.Date
java.sql.Time
java.sql.Timestamp
类型的变量自动识别为 date
time
datetime
。因此当变量是以上三种类型时,FreeMarker会自动匹配设置的格式,不须要在变量的后面加上?date
?time
?datetime
。数据库
#3. 变量为 java.util.Date
类型时的困惑 FreeMarker没法自动识别 java.util.Date
类型应该显示哪一种格式,这时须要明确的指定其要显示的格式,不然FreeMarker将会抛出异常。但有些时候咱们发现 java.util.Date
类型的变量没有指定格式在页面也能正确显示,这是什么状况?例如:缓存
@Entity @Table(name = "Tmp_Company") public class Company extends UuidEntity { ... /** 成立日期 */ @Temporal(TemporalType.DATE) private java.util.Date foundDate; ... }
在查看页面使用${company.foundDate}
时,没有指定格式却可以正确显示。这是由于@Temporal(TemporalType.DATE)
注解让ORM框架在从数据库中取出数据后将 java.util.Date
类型自动转换成了 java.sql.Date
类型,这时FreeMarker会自动识别其格式。假如在这个业务实体类上加上@Cache
注解,分别使用不一样的缓存策略,还会出现更有意思的现象,这里就不展开说了。框架
#4. 结论 当变量类型是 java.sql.Date
java.sql.Time
java.sql.Timestamp
时,能够不用指定格式;当变量类型是 java.util.Date
时,指定格式才是最稳妥的办法。ui
#5. 补充 若是上例中的foundDate容许为null时,在页面怎么写才会不报错呢?code
${foundDate?date!} ${(foundDate?date)!} ${foundDate!?date} ${(foundDate!)?date}
已是很丑陋的写法了吧,但以上写法都是错误的,正确的只能这么写:orm
${(foundDate?string("yyyy-MM-dd"))!}