2014-03-01 17 views
0

的JavaDoc Date类规定,正开始日期与时间(毫秒)构造

public Date(long date) 
Allocates a Date object and initializes it to represent the specified number of   
milliseconds since the standard base time known as "the epoch", namely January 1, 1970, 
00:00:00 GMT. 

下面是一个使用日期计算的毫秒数(长毫秒)构造函数计算1月24日和1月25日期代码

public static void main(String[] args) throws java.text.ParseException { 

    long milliSecFor25 = (24*60*60*24*1000); 
    long milliSecFor26 = (25*60*60*24*1000); 
    Date dateJan25 = new Date(milliSecFor25); 
    Date dateJan26 = new Date(milliSecFor26); 
    System.out.println("Date for Jan 25:" + dateJan25); 
    System.out.println("Date for Jan 26:" + dateJan26); 
} 

上执行下面的代码我得到下面的输出,

Date for Jan 25: Sun Jan 25 05:30:00 IST 1970 
    Date for Jan 26: Sun Dec 07 12:27:12 IST 1969 

这是不正确的。有人可以解释为什么不`吨我得到年01月25

正确的日期
+0

,我认为你应该检查你的“暧昧”的使用以供将来参考 - 我想你只是说“不正确”在这里,这是不一样的东西。 –

+0

@JonSkeet:雅好感谢,我将在这里改变它太 –

回答

5

的问题是在这里:

25*60*60*24*1000 

所有这一切都在整数执行算术 - 和值溢出。

你可以看到,如果执行使用long值而不是算术,并显示结果相比Integer.MAX_VALUE

milliSecFor26 = (25*60*60*24*1000L); 
System.out.println("Millis: " + milliSecFor26); 
System.out.println("Integer.MAX_VALUE: " + Integer.MAX_VALUE); 

打印:

Millis: 2160000000 
Integer.MAX_VALUE: 2147483647 

所以你int算术实际上是溢出来一个值,这就是为什么你看到Unix纪元前Date值。

随着旁白:

  • 您可以使用TimeUnit.DAYS.toMillis(26)作为计算这一
  • 在Java标准库(前的Java 8),你应该使用Calendar以获得适当的Date从更清洁的方式年/月/日
  • Joda Time更好库Date/Calendar
  • 爪哇8将具有even cleaner date/time API(在java.time包)。
6

你有一个整数溢出。使用多头,而不是整数:

long milliSecFor25 = (24L * 60L * 60L * 24L * 1000L);