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日的正确日期
答案 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)
作为更清晰的计算方式Calendar
从一年/月/日获取适当的Date
Date
/ Calendar
java.time
包中)。