Calendar是个JDK1.1就加入了的日期相关的API,加入后很大程度上取代了JDK1.0时代的Date类。本文将简要介绍下Calendar类的用法和注意事项。
简要看下类的声明:
public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar> {
...
可以看到除了事向Serializable等接口外,Calendar类最大的一个特点就是被声明为一个抽象类。这也使得它的实例化方式有所区别。
上文提到,Calendar被声明为抽象类,因此要调用它主要有两种比较特别的实例化方式:
// 方式一:创建其子类(GregorianCalendar)的对象
GregorianCalendar gc = new GregorianCalendar();
// 方式二:调用其静态方法
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getClass()); // class java.util.GregorianCalendar
上面代码中我们可以看到即便是调用静态方法的形式获得的也是其子类的对象,两个实例化方式没有本质区别。
成功实例化的子类对象会储存默认时区的当前时间。
该方法会接收一个int型的变量,准确来说是接收一个“标识符”,同时返回一个int类型的数值。
关于“标识符”,Calendar类里定义了相当多的常量,并赋予这些常量特定的含义:
从字面意义上也不难理解这些“标识符”的含义,在get方法中传入 部分对应的“标识符” 后就会得到相应的结果。
下面挑选其中几个进行演示,演示日期为2020.06.24,15:24:
System.out.println(calendar.get(Calendar.DAY_OF_MONTH)); // 24,表示当前日期是该月第24天
System.out.println(calendar.get(Calendar.DAY_OF_WEEK)); // 4,以周日为1,4表示今天是周三
System.out.println(calendar.get(Calendar.HOUR_OF_DAY)); // 15,现在是15点
System.out.println(calendar.get(Calendar.DAY_OF_YEAR)); // 176,今天是今年的第176天
该方法用于修改Calendar对象所记录的时间,同样依赖于“标识符”的使用。第一个参数为“标识符”,表示修改的类型,第二个参数为修改的变量值,返回为空。
举几个例子:
calendar.set(Calendar.DAY_OF_YEAR,1); // 将记录的时间修改为记录年份的第一天
calendar.set(Calendar.HOUR_OF_DAY,12); // 将记录的时间修改为记录天的第12个小时
calendar.set(Calendar.MONTH,3); // 设为记录年份的第4个月
此外set还有几个重载方法:
这些重载方法从传入的参数上看也容易理解其作用,这里就不做演示了。
从方法名上也好理解,通过传入的“标识符”field”,在现有的基础数据上新增amount大小的数据量。
举例:
calendar.add(Calendar.DAY_OF_MONTH,3); // 在现有当月第x天的基础上,再新增3天,即当月第x+3天
值得一提的是,若需要减去一个数据量,amount传入负数即可。
getTime方法提供了一个calendar对象转化为Date型对象的方法。
Date date = calendar.getTime();
getTime的逆向方法,传入一个Date型对象,将calendar对象存储的时间修改。
Date date1 = new Date();
calendar.setTime(date1);
常用的方法就是以上所介绍的这些,方法比较多,建议多实操敲下代码能加深记忆。
Calendar类有个小细节值得一说,细心的朋友上面可能已经注意到了:
calendar.set(Calendar.MONTH,3); // 设为记录年份的第4个月
传入的是 3 却是设定为第4个月。
实际上Calendar类对月份的记录是按0开始的,即0表示1月,11表示12月。就月份这一点比较特别,其他的天数、小时数等都和现实计数上一致。