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