2011-06-22 51 views
9
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,那么我会假设该议案是一年前。但不是......大约三周前?!?Java日期问题,找到日期X天前

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 

回答

25

如何:

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

返回一天的同一时间,无论DST还是闰年,更短,更清晰......

一般Calendar就是在这样的路要走病例(除非您使用第三方库,如乔达时间)。你可以使用它来进行各种计算:增加N天/小时/月/秒,截断时间到一整小时等等 - 只有long才会太痛苦。

关于你原来的问题,它似乎是整数溢出的牺牲品。它的工作原理,如果乘明确地使用长:

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

很好的解决方案。现在它都按预期工作:) – Jesper

+3

+1告诉他什么是错的,而不是简单地给出解决方案。 –

0

这条线:

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

的RHS应该是:31536000000.你有东西要少得多,作为RHS的原因被评价为int (因为所有数量都是整数),并且超出了MAX_INT。要纠正这个:

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

注意字母“l”,这使得1000是一个长期的 - 现在的RHS将被评估为长。

+0

感谢大家。我会按照你所有的建议去看日历。 – Jesper

3

就试试这个:

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

有了新的代码,你将不能松,由于整数乘法的数字。 由于我们将文字24标记为long,所以乘法将通过将第一个操作数numdaysback自动转换为long来完成。乘法的其余部分也将在很长的操作数上完成。

0

Date类(非正式)不赞成使用。这个API有很多错误,因此使用Dates/Times很困难。最简单的例子就像你的代码differencems。如果中间的时间包含夏令时开关(如果您不使用UT)并且总是无法处理闰秒,则会失败。

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