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());
}
}
Run Code Online (Sandbox Code Playgroud)
产量
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
Run Code Online (Sandbox Code Playgroud)
在"5月31日"之后,它将是"5月30日,5月29日,5月28日和5月27日",但它返回错误的日期.
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
Run Code Online (Sandbox Code Playgroud)
这个错误在Calendar.getTime()吗?
不,这不是一个错误Calendar.getTime().
你正在使用int,当数字变得太大而无法适应时int,那么i * oneDay溢出就会得到奇怪的结果.
解决方案:long改为使用:
final long oneDay = 24L * 60 * 60 * 1000;
Run Code Online (Sandbox Code Playgroud)
(您的代码也不考虑夏令时,如果您的时区有夏令时,您会看到一小时的转变).
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |