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

  • Post author:
  • Post category:java


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点。



版权声明:本文为tan_jianhui原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。