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日的正确日期
你有一个整数溢出.使用long而不是int:
long milliSecFor25 = (24L * 60L * 60L * 24L * 1000L);
Run Code Online (Sandbox Code Playgroud)
问题出在这里:
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)更清晰的方式来计算它Calendar获取适当的值DateDate/Calendarjava.time包中).