【问题标题】:Error printing dates days diff in Freemarker在 Freemarker 中打印日期天数差异时出错
【发布时间】:2014-10-28 05:44:38
【问题描述】:

我对 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);

【问题讨论】:

标签: java date datetime freemarker


【解决方案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 解决了这个问题。

【讨论】:

  • 我现在明白了,我只是误解了?datetime 的用途.. 它只是有一个非常混乱的名称..
猜你喜欢
  • 2021-06-15
  • 2011-08-29
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 2016-08-04
相关资源
最近更新 更多