java.util.Date:七天前

时间:2011-02-04 20:35:51

标签: java jasper-reports java.util.date

我在Jasper Reports中创建了一个报告,它只识别java.util.Date(不是Calendar或Gregorian等)。

有没有办法在当前日期前7天创建日期?

理想情况下,它看起来像这样:

new Date(New Date() - 7)

更新:我不能强调这一点:JasperReports不会识别Java Calendar对象。

12 个答案:

答案 0 :(得分:50)

从现在开始:

long DAY_IN_MS = 1000 * 60 * 60 * 24;
new Date(System.currentTimeMillis() - (7 * DAY_IN_MS))

来自任意Date date

new Date(date.getTime() - (7 * DAY_IN_MS))

编辑:正如其他答案中所指出的,如果这是一个因素,则不考虑夏令时。

只是为了澄清我所说的限制:

对于受夏令时影响的人 ,如果是7 days earlier,则表示如果现在是12pm noon on 14 Mar 2010,则需要进行计算7 days earlier导致12pm on 7 Mar 2010,请小心。

此解决方案可以在24小时* 7天= 168小时之前找到日期/时间。

但是,当此解决方案发现(14 Mar 2010 1:00pm) - 7 * DAY_IN_MS 可能 返回{{}>时,某些人感到惊讶 {1}}您的时区 挂钟时间 在2个日期/时间((7 Mar 2010 12:00pm)1pm之间不一致)。这是因为当晚开始或结束的夏令时以及“挂钟时间”失去或获得一小时。

如果DST不是您的一个因素,或者您确实确实想要12pm(无论挂钟时间如何变化),那么此解决方案可以正常工作。

否则,您可能需要补偿(168 hours)何时并不真正意味着168小时(由于DST在该时间范围内开始或结束)。

答案 1 :(得分:26)

使用Calendar的工具使用getTime()创建新的Date对象:

import java.util.GregorianCalendar;
import java.util.Date;

Calendar cal = new GregorianCalendar();
cal.add(Calendar.DAY_OF_MONTH, -7);
Date sevenDaysAgo = cal.getTime();

答案 2 :(得分:13)

 Date sevenDay = new Date(System.currentTimeMillis() - 7L * 24 * 3600 * 1000));

另一种方法是使用日历,但我不喜欢自己使用它。

答案 3 :(得分:8)

因为还没有人提到TimeUnit

new Date(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(7))

答案 4 :(得分:5)

试试这个:

Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_MONTH, -7);
return c.getTime();

答案 5 :(得分:2)

我不确定他们何时添加了这些内容,但JasperReports有自己的一套“函数”可以操作日期。这是一个我没有彻底测试的例子:

DATE(YEAR(TODAY()), MONTH(TODAY()), DAY(TODAY()) - 7)

构建java.util.Date,日期设置为从今天起7天。如果您想使用其他“锚点”日期,只需将TODAY()替换为您想要使用的日期。

答案 6 :(得分:1)

确定“天”需要时区。时区定义“日”开始的时间。时区包括处理夏令时和其他异常的规则。没有任何魔力使时区无关紧要。如果忽略该问题,将应用JVM的默认时区。这往往会导致混乱和痛苦。

避免使用java.util.Date

java.util.Date和.Calendar类非常麻烦。避免他们。它们非常糟糕,Sun / Oracle同意用Java 8中的新java.time package取代它们。使用它或Joda-Time

约达时间

Joda-Time 2.3中的示例代码。

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" ); // Specify or else the JVM's default will apply.
DateTime dateTime = new DateTime( new java.util.Date(), timeZone ); // Simulate passing a Date.
DateTime weekAgo = dateTime.minusDays( 7 );

第一时刻

或者,您可能希望将时间调整为当天的第一时刻,以便捕获一整天的时间。调用方法withTimeAtStartOfDay。请注意,这通常是00:00:00,但并非总是如此。

避免使用Joda-Time中的“午夜”方法和类。它们基于错误的概念,现已弃用。

DateTime dateTimeStart = new DateTime( new java.util.Date(), timeZone ).withTimeAtStartOfDay(); // Not necessarily the time "00:00:00".
DateTime weekAgo = dateTime.minusDays( 7 ).withTimeAtStartOfDay(); 

转换为/从j.u.Date

如上所示,要从java.util.Date转换为Joda-Time,只需将Date对象传递给DateTime的构造函数。了解j.u.Date 没有时区,DateTime可以。因此,请指定所需/适当的时区,以确定“天”是什么以及何时开始。

换句话说,DateTime到j.u.Date,只需调用toDate方法。

java.util.Date date = dateTime.toDate();

答案 7 :(得分:0)

你有没有理由不能在你的支持bean中进行计算?然后将其作为参数发送到您的报告中。

答案 8 :(得分:0)

由于讨论热烈:

问题可能没有指定时区的正确答案。

下面是一些代码,可以使用默认(因此已弃用)的时区来考虑默认的时区夏令时。

Date date= new Date();
date.setDate(date.getDate()-7);//date works as calendar w/ negatives

虽然解决方案确实有效,但它与假设时区一样虚假。

new Date(System.currentTimeMillis() - 10080*60000);//a week has 10080 minutes

请不要投票给答案。

答案 9 :(得分:0)

我这样做:

Date oneWeekAgo = DateUtils.addDays(DateUtils.truncate(new Date(), java.util.Calendar.DAY_OF_MONTH), -7);

答案 10 :(得分:0)

您可以尝试一下,

    Calendar c = Calendar.getInstance();
    c.add(Calendar.DAY_OF_MONTH, -7);
    System.out.println(new java.sql.Date(c.getTimeInMillis()));

答案 11 :(得分:0)

基于Java 8的解决方案:

new Date(Instant.now().minus(7, ChronoUnit.DAYS).toEpochMilli()))