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

Aar*_*esh 0 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.
Run Code Online (Sandbox Code Playgroud)

下面是通过使用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);
}
Run Code Online (Sandbox Code Playgroud)

在执行以下代码时,我得到以下输出,

    Date for Jan 25: Sun Jan 25 05:30:00 IST 1970
    Date for Jan 26: Sun Dec 07 12:27:12 IST 1969
Run Code Online (Sandbox Code Playgroud)

哪个不对.有人可以解释为什么我没有得到1月25日的正确日期

JB *_*zet 6

你有一个整数溢出.使用long而不是int:

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


Jon*_*eet 5

问题出在这里:

25*60*60*24*1000
Run Code Online (Sandbox Code Playgroud)

所有这些都是用整数运算执行的- 而且这个值是溢出的.

您可以看到,如果您使用long值执行算术,并将结果显示为Integer.MAX_VALUE:

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

打印:

Millis: 2160000000
Integer.MAX_VALUE: 2147483647
Run Code Online (Sandbox Code Playgroud)

所以你的int算术实际上溢出为负值,这就是你在DateUnix时代之前看到一个值的原因.

作为旁白:

  • 您可以使用TimeUnit.DAYS.toMillis(26)更清晰的方式来计算它
  • 在Java标准库(Java 8之前版本)中,您应该使用从年/月/日Calendar获取适当的值Date
  • 乔达时间多少比更好库Date/Calendar
  • Java 8将具有更清晰的日期/时间API(在java.time包中).