在Freemarker中打印日期天差错误

时间:2014-09-03 16:18:12

标签: java date datetime freemarker

我遇到了freemarker日期的问题。

我想比较日期并打印日差异。 第一个日期传递给模型(java.util.Date) 第二个是freemarker .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

然后我尝试添加?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);

1 个答案:

答案 0 :(得分:1)

foo?datetime("yyyy-MM-dd'T'HH:mm:ssZ")是一个字符串(也具有给定的格式)时,

foo意味着要使用。然后它会将String转换为java.util.Date。但.now已经java.util.Date,因此您不需要也无法使用模式转换它。只有字符串必须像这样转换。然后两者都可以?long - 编辑,然后你去。

对于未来的读者:从2.3.21开始,您应该将ISO 8601字符串转换为日期时间,如foo?datetime.iso。不仅因为它更方便,而且因为ISO 8601允许相当多的日期时间格式模式,当然不可能用单一模式覆盖所有这些模式。 ?datetime.iso处理这个问题。