使用Date(毫秒)构造函数初始化日期

时间:2014-03-01 12:19:22

标签: java date

Date类的JavaDoc说明了

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.

下面是通过使用Date(long milliSeconds)构造函数计算毫秒数来计算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

这是不正确的。有人可以解释为什么我没有得到1月25日的正确日期

2 个答案:

答案 0 :(得分:6)

你有一个整数溢出。使用long而不是ints:

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

答案 1 :(得分: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值的原因。

as asides:

  • 您可以使用TimeUnit.DAYS.toMillis(26)作为更清晰的计算方式
  • 在Java标准库(Java 8之前版本)中,您应该使用Calendar从一年/月/日获取适当的Date
  • Joda Time 更好的库,而不是Date / Calendar
  • Java 8将有一个even cleaner date/time API(在java.time包中)。