我遇到了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);
答案 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
处理这个问题。