2014-09-03 60 views
0

我在freemarker日期有問題。的錯誤在Freemarker中打印日期天差異

我想比較日期並打印日差。 將第一個日期傳遞給模型(java.util.Date) 第二個是自由標記.now var。

所以我這樣做:

<#assign currentDate = .now> 
<#if currentDate?long < trip.endDate?long> <#-- Not ended --> 

這是工作正常,但後來當我試圖讓天差異,如下所述:How do I calculate the difference in days between two ISO8601 dates with Freemarker?

我做:

<#assign currentDate = .now> 
${((trip.startDate?datetime("yyyy-MM-dd'T'HH:mm:ssZ")?long - currentDate?datetime("yyyy-MM-dd'T'HH:mm:ssZ")?long)/(1000 * 60 * 60 * 24))?int} 

這是投擲:

Expected method. trip.startDate?datetime evaluated instead to freemarker.template.SimpleDate

然後我tryied加入?date因爲我看到一些做的,爲了得到正確類型的對象,這樣

<#assign currentDate = .now> 
${((trip.startDate?date?datetime("yyyy-MM-dd'T'HH:mm:ssZ")?long - currentDate?datetime("yyyy-MM-dd'T'HH:mm:ssZ")?long)/(1000 * 60 * 60 * 24))?int} 

而且它拋出:

Cannot convert DATE into DATETIME

剛以確保我使用的對象是java.util.Date,這裏是我的Trip類:

package com.test.planner.dto; 

import java.util.Date; 

public class Trip 
    implements Comparable<Trip> { 

    private Date startDate; // start date 
    private Date endDate; // end date 

    // ... 

    public Date getStartDate() { 
     return this.startDate; 
    } 

    public void setStartDate(Date startDate) { 
     this.startDate = startDate; 
    } 

    public Date getEndDate() { 
     return this.endDate; 
    } 

    public void setEndDate(Date endDate) { 
     this.endDate = endDate; 
    } 

    @Override 
    public int compareTo(Trip o) { 
     return this.getStartDate().compareTo(o.getStartDate()); 
    } 
} 

而且我傳遞這模型:

Trip trip = new Trip(); 
trip.setStartDate(new Date(1410318000000L)); // Wed Sep 10 2014 00:00:00 GMT-0300 (BRT) 
trip.setEndDate(new Date(1410318000000L + 691200000L)); // Plus 8 days 

mav.addObject("trip", trip); 
+0

你爲什麼要調用'?datetime'? – 2014-09-03 18:22:10

+0

因爲我提供的鏈接中聲明:http://stackoverflow.com/questions/11412040/how-do-i-calculate-the-difference-in-days-between-two-iso8601-dates-with-freemar 那是錯的嗎? – 2014-09-03 18:23:00

+0

在該鏈接日期是在特定的格式。 – 2014-09-03 18:24:45

回答

1

foo?datetime("yyyy-MM-dd'T'HH:mm:ssZ")意味着當foo是一個字符串(也有給定的格式)中使用。然後它會將String轉換爲java.util.Date。但.now已經java.util.Date,所以你不需要,也不能用模式轉換它。只有字符串必須如此轉換。那麼兩者都可以是?long -ed,然後你就可以走了。

對於未來的讀者:從2.3.21開始,您應該將ISO 8601字符串轉換爲日期時間,如foo?datetime.iso。不僅僅是因爲它更方便,而且因爲ISO 8601允許不少日期 - 時間格式模式,當然不可能用單一模式覆蓋所有這些模式。 ?datetime.iso照顧這個問題。

+0

我現在知道了,我只是錯誤地理解了'?datetime'的目的..它只是有一個令人困惑的名字.. – 2014-09-03 20:38:03

+1

當然,它應該被稱爲'?to_datetime' ... – ddekany 2014-09-03 20:43:47