#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"))!}