[原]java.util.Calendar的MilliSecond域需要注意的地方

    java.util.Calendar的MilliSecond域表示1/1000秒,理論取值範圍是0-999。Calendar提供set(int field, int value) 方法可以對Calendar的各個域進行設置,設置MilliSecond域可以這樣做:set(Calendar.MILLISECOND, 234)。一般value爲0-999中的一個值,但如果將一個大於或等於1000的值傳入以上調用會有什麼結果呢?看以下代碼就清楚了。

 

代碼:

-------------------------------------------------------------------------------------------------------------

package com.leo.testcalendar;

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        Calendar calendar = Calendar.getInstance();

        System.out.println("1.Origin");
        calendar.set(2009, Calendar.SEPTEMBER, 1, 0, 0, 0);
        System.out.println("Calendar is : " + format.format(calendar.getTime()));
        System.out.println("MilliSecond is: " + calendar.get(Calendar.MILLISECOND));
       
        System.out.println();
        System.out.println("2.Set MilliSecond to 456");
        calendar.set(Calendar.MILLISECOND, 456);
        System.out.println("Calendar is : " + format.format(calendar.getTime()));
        System.out.println("MilliSecond is: " + calendar.get(Calendar.MILLISECOND));
       
        System.out.println();
        System.out.println("3.Set MilliSecond to 1000");
        calendar.set(Calendar.MILLISECOND, 1000);
        System.out.println("Calendar is : " + format.format(calendar.getTime()));
        System.out.println("MilliSecond is: " + calendar.get(Calendar.MILLISECOND));
       
        System.out.println();
        System.out.println("4.Set MilliSecond to 2222");
        calendar.set(Calendar.MILLISECOND, 2222);
        System.out.println("Calendar is : " + format.format(calendar.getTime()));
        System.out.println("MilliSecond is: " + calendar.get(Calendar.MILLISECOND));
       
        System.out.println();
        System.out.println("5.Set Second to 70");
        calendar.set(Calendar.SECOND, 70);
        System.out.println("Calendar is : " + format.format(calendar.getTime()));
        System.out.println("Second is: " + calendar.get(Calendar.SECOND));
       
        System.out.println();
        System.out.println("6.Print Long type value of Calendar");
        System.out.println("Long type value of Calendar is : " + calendar.getTime().getTime());       
    }
}

-------------------------------------------------------------------------------------------------------------

 

結果

-------------------------------------------------------------------------------------------------------------

1.Origin
Calendar is : 2009-09-01 00:00:00.847
MilliSecond is: 847

2.Set MilliSecond to 456
Calendar is : 2009-09-01 00:00:00.456
MilliSecond is: 456

3.Set MilliSecond to 1000
Calendar is : 2009-09-01 00:00:01.000
MilliSecond is: 0

4.Set MilliSecond to 2222
Calendar is : 2009-09-01 00:00:03.222
MilliSecond is: 222

5.Set Second to 70
Calendar is : 2009-09-01 00:01:10.222
Second is: 10

6.Print Long type value of Calendar
Long type value of Calendar is : 1251763270222

-------------------------------------------------------------------------------------------------------------

 

結論:

由於在java中,時間相關的類型最終存儲在Long型中,而MilliSecond在其中僅佔用最後3位,如果在設置MilliSecond時,超出了3位數的範圍,那麼會繼續佔用其他域的位。所以,在調用set(Calendar.MILLISECOND, value)時,除非明確知道自己的意圖,否則,不用使用超出理論範圍的值去設置MILLISECOND。對於其他的域也同樣適用,如結果中的第5點。

發佈了68 篇原創文章 · 獲贊 1 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章