[英]Wrong output from Java Calendar API
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
在“ 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
Calendar.getTime()
這個錯誤嗎?
不,這不是Calendar.getTime()
的錯誤。
您正在使用int
,並且當數字變得太大而無法容納int
,則i * oneDay
溢出,您會得到奇怪的結果。
解決方案:改用long
代替:
final long oneDay = 24L * 60 * 60 * 1000;
(您的代碼也沒有考慮夏令時,如果您所在的時區具有夏令時,有時您會看到一個小時的偏移)。
您正在執行整數算術,並且溢出了int。 (有符號的)int的最大值是2,147,483,647(2 ^ 31-1)。 ONE_DAY有86,400,000毫秒。 在第25天,您達到了2,160,000,000,這是一個比int表示的值還大的值,並且您溢出成負數。
您可以通過使用long而不是int進行數學運算來解決此問題。
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());
}
}
更換
final int oneDay = 24 * 60 * 60 * 1000;
與
final long oneDay = 24 * 60 * 60 * 1000;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.