[原]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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章