java.util.Date:七天前

Ram*_*amy 26 java jasper-reports java.util.date

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

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

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

new Date(New Date() - 7)
Run Code Online (Sandbox Code Playgroud)

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

Ber*_*t F 53

从现在开始:

long DAY_IN_MS = 1000 * 60 * 60 * 24;
new Date(System.currentTimeMillis() - (7 * DAY_IN_MS))
Run Code Online (Sandbox Code Playgroud)

从任意Date date:

new Date(date.getTime() - (7 * DAY_IN_MS))
Run Code Online (Sandbox Code Playgroud)

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

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

对于受夏令时影响的人,如果是7 days earlier,你的意思是,如果现在是12pm noon on 14 Mar 2010,你想要计算7 days earlier结果12pm on 7 Mar 2010,那么要小心.

此解决方案准确地找到24小时*7天= 168小时之前的日期/时间.

但是,有些人会惊讶地发现,例如,当您的时区中的挂钟时间在 2个日期/时间(vs )之间不同时,此解决方案(14 Mar 2010 1:00pm) - 7 * DAY_IN_MS 可能会返回结果.这是因为当晚开始或结束的夏令时以及"挂钟时间"失去或获得一小时.(7 Mar 2010 12:00pm)1pm12pm

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

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


Pow*_*ord 29

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

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

Calendar cal = new GregorianCalendar();
cal.add(Calendar.DAY_OF_MONTH, -7);
Date sevenDaysAgo = cal.getTime();
Run Code Online (Sandbox Code Playgroud)

  • 问题表明您无法使用日历. (3认同)
  • @Dusty:它没有指定日期如何到达报告.我从措辞中做出了假设,即最终结果必须是Date对象,但是Calendar可以在两者之间使用. (2认同)

Pet*_*rey 13

尝试

 Date sevenDay = new Date(System.currentTimeMillis() - 7L * 24 * 3600 * 1000));
Run Code Online (Sandbox Code Playgroud)

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

  • 正是我在寻找的东西. (2认同)

Dan*_*iel 9

既然没有人提到过TimeUnit:

new Date(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(7))
Run Code Online (Sandbox Code Playgroud)


Ant*_*sek 8

基于Java 8的解决方案:

new Date(
     Instant.now().minus(7, ChronoUnit.DAYS)
     .toEpochMilli()
)
Run Code Online (Sandbox Code Playgroud)


Jef*_*tin 5

试试这个:

Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_MONTH, -7);
return c.getTime();
Run Code Online (Sandbox Code Playgroud)