簡體   English   中英

Java Calendar API輸出錯誤

[英]Wrong output from Java Calendar API

Calendar.setTimeInMillisCalendar.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM