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

Jes*_*per 9 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);
Run Code Online (Sandbox Code Playgroud)

如果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
Run Code Online (Sandbox Code Playgroud)

Kon*_*rus 26

怎么样:

Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, -1);
Date thendate = cal.getTime();
Run Code Online (Sandbox Code Playgroud)

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

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

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

long differencems = 365 * 24 * 60 * 60 * 1000L;
Run Code Online (Sandbox Code Playgroud)

  • +1告诉他什么是错的,而不是简单地给出解决方案. (4认同)
  • 仅供参考,非常麻烦的旧日期时间类,例如 [`java.util.Date`](https://docs.oracle.com/javase/10/docs/api/java/util/Date.html),[ `java.util.Calendar`](https://docs.oracle.com/javase/10/docs/api/java/util/Calendar.html) 和 `java.text.SimpleDateFormat` 现在是[旧版]( https://en.wikipedia.org/wiki/Legacy_system),由 [*java.time*](https://docs.oracle.com/javase/10/docs/api/java/time/package- Summary.html) Java 8 及更高版本中内置的类。请参阅 Oracle 的 [*教程*](https://docs.oracle.com/javase/tutorial/datetime/TOC.html)。 (2认同)

Kri*_*ris 7

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

Date xDaysAgo = Date.from( Instant.now().minus( Duration.ofDays( x ) ) );
Run Code Online (Sandbox Code Playgroud)