java中使用 Calendar 类写一个万年历
Calendar类位于util包中,是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。
该类还为实现包范围外的具体日历系统提供了其他字段和方法。这些字段和方法被定义为 protected。 与其他语言环境敏感类一样,Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。
Calendar 的 getInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化:
Calendar rightNow = Calendar.getInstance();
思路与注意事项
- 使用Calendar类写一个万年历, 首先我们要知道创建一个Calendar实例时就已经获得了当前系统的时间,如果要选择特定的年月。就需要用set方法修改。
- Calendar类中定义了一些常量(static final int),比如DAY_OF_WEEK,YEAR,MONTH 等等,这些字段数字都是静态的常量值,那为什么还能对其修改呢?还可以使用add,set等方法对其设置呢?其实并不是这样,就相当于switch()语句中括号内的常量表达式,Calendar类中的常量就是一些key值,当调用Calendar及其子类方法时,方法根据参数中传入Calendar类中的常量会进入到对应分支中去处理数据。而不是去改变常量来获得我们想要的数据。
- 万年历由指定年月的天数和星期组成,所以需要获得指定年月准确的天数和月初第一天是周几。
- 在Calendar想要知道某一个月的完整天数(获得月数最大值),需要用到getActualMaximum(int field)方法,获得星期需要用get(DAY_OF_WEEK)方法。
public void print(int year,int month){
Calendar calendar = Calendar.getInstance();
//set修改calendar为指定年月 set(x,y),x为想要被修改value的key值, 将y值放入value中(y为新的value);
calendar.set(Calendar.YEAR,year);
calendar.set(Calendar.MONTH,month-1);
//传入每个月的第一天,目的为了通过calendar.get(Calendar.DAY_OF_WEEK)方法能够获得第一天的星期数,完成万年历的开头
calendar.set(Calendar.DAY_OF_MONTH,1);
// 获得该月的完整天数
int actualMaximum = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
//如果calendar时间是3号 calendar.get(Calendar.DAY_OF_WEEK)会返回3号的星期数+1;
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK)-1;
int count =0;
// 星期是逢7进0 当dayOfWeek=0时改为7 否则无法第一个for循环,日期与星期不能正确对应
if (dayOfWeek==0)dayOfWeek=7;
System.out.println("一\t二\t三\t四\t五\t六\t日\t");
for(int i =0;i<dayOfWeek-1;i++){
System.out.print("\t");
count++;
}
for (int i =1;i<=actualMaximum;i++){
count++;
System.out.print(i+"\t");
//当count ==7时,换行。
if (count%7==0){
System.out.println();
}
}
}
好了 最后看看效果

浙公网安备 33010602011771号