Calendar.setTimeInMillis
和 Calendar.getTime
很奇怪。它返回错误的日期结果。
Java代码
public static void main(String[] args)
{
Calendar cal = Calendar.getInstance();
final int oneDay = 24 * 60 * 60 * 1000;
for(int i=0; i < 30; i++) {
cal.setTimeInMillis(System.currentTimeMillis() - i * oneDay);
System.out.println(cal.getTime());
}
}
输出
Tue Jun 24 17:50:35 IST 2014
Mon Jun 23 17:50:35 IST 2014
Sun Jun 22 17:50:35 IST 2014
Sat Jun 21 17:50:35 IST 2014
Fri Jun 20 17:50:35 IST 2014
Thu Jun 19 17:50:35 IST 2014
Wed Jun 18 17:50:35 IST 2014
Tue Jun 17 17:50:35 IST 2014
Mon Jun 16 17:50:35 IST 2014
Sun Jun 15 17:50:35 IST 2014
Sat Jun 14 17:50:35 IST 2014
Fri Jun 13 17:50:35 IST 2014
Thu Jun 12 17:50:35 IST 2014
Wed Jun 11 17:50:35 IST 2014
Tue Jun 10 17:50:35 IST 2014
Mon Jun 09 17:50:35 IST 2014
Sun Jun 08 17:50:35 IST 2014
Sat Jun 07 17:50:35 IST 2014
Fri Jun 06 17:50:35 IST 2014
Thu Jun 05 17:50:35 IST 2014
Wed Jun 04 17:50:35 IST 2014
Tue Jun 03 17:50:35 IST 2014
Mon Jun 02 17:50:35 IST 2014
Sun Jun 01 17:50:35 IST 2014
Sat May 31 17:50:35 IST 2014
Sat Jul 19 10:53:23 IST 2014
Fri Jul 18 10:53:23 IST 2014
Thu Jul 17 10:53:23 IST 2014
Wed Jul 16 10:53:23 IST 2014
Tue Jul 15 10:53:23 IST 2014
&#34; 5月31日&#34; ,这将是&#34; 5月30日,5月29日,5月28日&amp; 5月27日&#34;但它返回错误的日期。
Sat May 31 17:50:35 IST 2014
Sat Jul 19 10:53:23 IST 2014
Fri Jul 18 10:53:23 IST 2014
Thu Jul 17 10:53:23 IST 2014
Wed Jul 16 10:53:23 IST 2014
Tue Jul 15 10:53:23 IST 2014
这是Calendar.getTime()
中的错误吗?
答案 0 :(得分:8)
不,这不是Calendar.getTime()
中的错误。
您正在使用int
,当数字太大而无法容纳int
时,i * oneDay
会溢出,您会得到奇怪的结果。
解决方案:改为使用long
:
final long oneDay = 24L * 60 * 60 * 1000;
(您的代码也不考虑夏令时,如果您的时区有夏令时,您会看到一小时的转变。)
答案 1 :(得分:2)
您正在执行整数运算并溢出了一个int。 (带符号)int的最大值是2,147,483,647(2 ^ 31-1)。 ONE_DAY有86,400,000毫秒。在第25天,您达到2,160,000,000,这是一个比在int中表示的更大的值,并且您会溢出到负数。
你可以用long来代替整数来解决这个问题。
public static void main(String[] args)
{
Calendar cal = Calendar.getInstance();
final long oneDay = 24 * 60 * 60 * 1000;
for(int i=0; i < 30; i++) {
cal.setTimeInMillis(System.currentTimeMillis() - i * oneDay);
System.out.println(cal.getTime());
}
}
答案 2 :(得分:1)
替换
final int oneDay = 24 * 60 * 60 * 1000;
与
final long oneDay = 24 * 60 * 60 * 1000;