FreeMarker中的日期時間處理

#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"))!}
相關文章
相關標籤/搜索