Java Calendar类遇到一个比较奇怪的问题

import java.util.Calendar;

public class T {
public static void main(String[] args) {//计算1100年的天数,应该是365天。但是为什么输出错误呢
Calendar calendar=Calendar.getInstance();
int year=1100,month=11,date=31; //1100年12月31日。距离1100年1月1日天数
long day=0;
calendar.set(year, month, date);
long time1=calendar.getTimeInMillis();
calendar.set(year, 0, 1);
long time2=calendar.getTimeInMillis();
day=(time1-time2)/1000/24/60/60+1;
System.out.println(day); //实际输出366

calendar.set(year+2000, month, date); //这里+2000就可以了
time1=calendar.getTimeInMillis();
calendar.set(year+2000, 0, 1);
time2=calendar.getTimeInMillis();
day=(time1-time2)/1000/24/60/60+1;
System.out.println(day); //实际输出365

calendar.set(year+1, month, date); //1101年天数
time1=calendar.getTimeInMillis();
calendar.set(year+1, 0, 1);
time2=calendar.getTimeInMillis();
day=(time1-time2)/1000/24/60/60+1;
System.out.println(day); //输出 365

}
}
为什么呢?照例来说 第一个 输出的应该也是365天额。。。1100年不是润年额。。。

首先,计算一年有多少天,可以直接取12月31号的DAY_OF_YEAR,没必要像你那样
System.out.println(calendar.get(Calendar.DAY_OF_YEAR));
另外,要看是不是闰年
分别取
int year=1100,month=1,date=29;
calendar.set(year, month, date);
System.out.println(calendar.get(Calendar.MONTH));
int year=1100,month=1,date=30;
calendar.set(year, month, date);
System.out.println(calendar.get(Calendar.MONTH));
看一下就知道了,很明显,2月29是2月的
2月30到了3月追问

1100年 不是闰年吧。。。

追答

这个不好说,闰年的规则是很复杂不是简单的四年一闰,百年不闰,四百年再闰
另外,Calendar类有BUG也不是不可能
现在的公历,在历史上好像有一段时间跳过去了,例如1号过了就直接是13号
中间一段时间没了
Calendar也是人写的,有错也不奇怪
你可以请该问题提交给java官网,不定下一版本就修正了

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-01
lastDate.set(Calendar.DATE,1);//设为当前月的1号
lastDate.add(Calendar.MONTH,1);//加一个月
lastDate.add(Calendar.DATE,-1);//减去一天
用 set 去加减不对的 换算基数是不一样的 也可以加减年
第2个回答  2011-10-31
看看
相似回答