Java Date问题,找到X天前的日期

时间:2011-06-22 12:37:36

标签: java date

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

5 个答案:

答案 0 :(得分:26)

怎么样:

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

无论DST或闰年如何,都会返回同一时间,更短更清晰......

通常Calendar是这种情况下的方法(除非您使用像Joda Time这样的第三方库)。您可以将它用于各种计算:添加N天/小时/月/秒,将时间截断为整整一小时等等 - 仅使用long会造成太大的痛苦。

关于你原来的问题,它似乎是整数溢出的受害者。如果乘法显式使用long:

,它可以工作
long differencems = 365 * 24 * 60 * 60 * 1000L;

答案 1 :(得分:3)

试试这个:

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

使用新代码,由于整数乘法,您不会丢失数字。 由于我们已经将文字24标记为长,因此乘法将通过将第一个操作数numdaysback自动转换为long来完成。乘法的其余部分也将在长操作数上完成。

答案 2 :(得分:1)

如果您使用的是Java 8及更高版本,则可以使用较新的java.time库使此操作更加简洁。

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

答案 3 :(得分:0)

这一行:

long differencems = numdaysback * 24 * 60 * 60 * 1000;

RHS应该是:31536000000。你有更少的东西,原因是RHS被评估为int(因为所有数量都是整数),并且你超过了MAX_INT。纠正这个:

long differencems = numdaysback * 24 * 60 * 60 * 1000l;

注意“l”使1000变长 - 现在RHS将被评估为长。

答案 4 :(得分:0)

{非常规)弃用Date类。 API有很多错误,很难让Dates / Times正确使用它。最简单的示例类似于differencems的代码。它失败了,如果中间的时间包含夏令时开关(如果你不使用UT)并且总是无法处理闰秒。

如果您的应用程序取决于正确的日期,您可能需要使用Joda Time