在 Freemarker 中打印日期天数差异时出错

Posted

技术标签:

【中文标题】在 Freemarker 中打印日期天数差异时出错【英文标题】:Error printing dates days diff in 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);

【问题讨论】:

你为什么打电话给?datetime 因为在我提供的链接中有说明:***.com/questions/11412040/…是不是错了? 链接日期采用特定格式。 【参考方案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 的用途.. 它只是有一个非常混乱的名称..

以上是关于在 Freemarker 中打印日期天数差异时出错的主要内容,如果未能解决你的问题,请参考以下文章

Freemarker 在模板中打印日期

Freemarker中的日期差异

如何在mongoDB中获取日期差异?日期应该是天数的差异?

试图在Python中找到用户出生日期和现在之间的天数差异

如何确定日期列表中的天数差异?

具有共同 id 的组中具有最大天数的两个日期之间的差异