java 时间类calendar的小问题

来源:百度知道 编辑:UC知道 时间:2024/06/04 03:02:54
import java.util.*;
public class Test{
public static void main(String args[]){
Calendar c=Calendar.getInstance();
c.set(Calendar.MONTH,0);
System.out.println(c.get(Calendar.MONTH));

c.set(Calendar.MONTH,1);
System.out.println(c.get(Calendar.MONTH));
}

}
我得到的结果是:
D:\test>javac *.java

D:\test>java Test
0
2

奇怪:为什么不是0和1呢?

我运行以上程序时,系统时间是2008年03月31日。好像把系统时间改到其他的日期就运行正常,为什么在2008-03-31这天就不行呢?请求解答。
!!请各位在运行的时候务必把系统时间改为:2008年03月31日,再运行看看。就知道我说的情况了!!!

本人猜测,仅为猜测:

因为Calendar月份是从0--11,你设置0就代表一月
因为当天为3月31日,当你设置月份为1的时候,
就对应到了日期的2月,此时2月没有31天,会自动完成日期的转换,可能转化为了3月2日

你输入日期试试

再我的机器上没问题啊!是0和1!
这个应该和系统时间没什么关系的!因为是set和get得到的!
下面的color4you说的对!
calender是这样的!

因为2月没有31号阿所以自动跳到了3月,1表示2月对马?把月份设置为1后成了2—31,所以系统直接把它设置成了3月2号吧,你看看日期是不是2号?

set(f, value) 将日历字段 f 更改为 value。此外,它设置了一个内部成员变量,以指示日历字段 f 已经被更改。尽管日历字段 f 是立即更改的,但是直到下次调用 get()、getTime()、getTimeInMillis()、add() 或 roll() 时才会重新计算日历的时间值(以毫秒为单位)。因此,多次调用 set() 不会触发多次不必要的计算。使用 set() 更改日历字段的结果是,其他日历字段也可能发生更改,这取决于日历字段、日历字段值和日历系统。此外,在重新计算日历字段之后,get(f) 没必要通过调用 set 方法返回 value 集合。具体细节是通过具体的日历类确定的。

示例:假定 GregorianCalendar 最初被设置为 1999 年 8 月 31 日。调用 set(Calendar.MONTH, Calendar.SEPTEMBER) 将该日期设置为 1999 年 9 月 31 日。如果随后调用 getTime(),那么这是解析 1999 年 10 月 1 日的一个暂时内部表示。但是,在调用 getTime() 之前调用 set(Calendar.DAY_OF_MONTH, 30) 会将该日期设置为 1999 年 9 月 30 日,因为在调用 set() 之后没有发生重新计算。

资料来源于JDK API 1.6.0