Java 日期问题,查找 X 天前的日期

2022-09-04 06:04:33
Date nowdate = new Date();
long nowms = nowdate.getTime();
long differencems = numdaysback * 24 * 60 * 60 * 1000;
long thenms = nowms - differencems;
Date thendate = new Date(thenms);

如果 numdaysback 是 365,那么我想那时的日期将是一年前。但事实并非如此...大约是三周前?!?

NUMDAYSBACK: 365
NOWDATE: Wed Jun 22 20:31:58 SGT 2011
NOWMS: 1308745918625
DIFFERENCEMS: 1471228928
THENMS: 1307274689697
THENDATE: Sun Jun 05 19:51:29 SGT 2011

答案 1

怎么样:

Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, -1);
Date thendate = cal.getTime();

无论 DST 还是闰年,返回的时间都相同,更短、更清晰...

通常,这是在这种情况下要走的路(除非您使用像Joda Time这样的第三方库)。你可以用它来进行各种计算:添加N天/小时/月/秒,将时间截断到一整小时等等 - 这些东西只会太痛苦了。Calendarlong

关于您最初的问题,它似乎是整数溢出的受害者。如果乘法显式使用 long,则有效:

long differencems = 365 * 24 * 60 * 60 * 1000L;

答案 2

如果您使用的是Java 8及更高版本,则可以使用较新的java.time库来更干净地执行此操作。

Date xDaysAgo = Date.from( Instant.now().minus( Duration.ofDays( x ) ) );