Date类诞生于JDK1.0版本,这个类有一些设计上的明显缺陷,其中最明显的一个缺陷就是Date类当中所定义的年份和真实的年份相差了1900,这导致开发者在对年份进行计算的时候还要多一个转换的步骤。Java官方在JDK1.1的基础类库中添加了一个Calendar类以弥补Date类设计上的缺陷,本小节就重点介绍Calendar类的使用。
10.2.1创建Calendar类对象
Calendar是一个抽象类,因此程序员不能直接通过构造方法创建这个类的对象。通常情况下,程序员都是通过Calendar类的getInstance()静态方法来获得其子类对象。通过getInstance()方法所获得的对象代表的是计算机操作系统当前的日期时间,如果希望用对象表示一个特定的日期时间,需要通过Calendar类的set()方法对日期时间的数值重新进行设定。下面的【例10_05】演示了如何创建Calendar类的子类对象来表示特定的日期时间。
【例10_05 创建Calendar类对象】
Exam10_05.java
import java.util.Calendar;
public class Exam10_05 {
public static void main(String[] args){
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
Calendar c3 = Calendar.getInstance();
//设置日期为2022年2月9日
c1.set(2022,1,9);
//设置时间为2022年2月9日16点15分
c2.set(2022,1,9,16,15);
//设置时间为2022年2月9日16点15分55秒
c3.set(2022,1,9,16,15,55);
}
}
【例10_05】中通过getInstance()方法创建了3个Calendar子类的对象,这3个对象在刚创建出来时都代表系统当前时间,之后通过set()方法为这3个对象设置了时间分量。需要注意:Calendar类虽然纠正了年份这个时间分量的偏差,但没有纠正月份这个时间分量,这就导致如果想把月份设置为2月,却要给第2个参数传递的数值为1。
10.2.2 Calendar类获得时间分量
Calendar类也提供了获取时间分量的方法,但与Date类不同的是:Calendar类中用于获取时间分量的只有一个get()方法,程序员要通过为get()方法传递不同的参数来表明要获得哪一个时间分量,每一个参数都代表一种特定时间分量。为方便编程,每一个参数都被定义为Calendar类的静态属性。下面的表10-4列出了各静态属性所代表的时间分量。
表10-4 Calendar类静态属性含义
静态属性 | 含义 |
YEAR | 年 |
MONTH | 月(月的值是从0开始的,即如果取出的值为0,即为1月) |
DATE | 日 |
HOUR | 以12小时为周期的小时(注意:正午和午夜用0表示,而不是12) |
MINUTE | 分钟 |
SECOND | 秒钟 |
MILLISECOND | 毫秒 |
HOUR_OF_DAY | 以24小时为周期的小时 |
DAY_OF_WEEK | 一星期的第几天,返回值范围1-7,星期日为第1天,星期一为第2天,以此类推 |
DAY_OF_MONTH | 一个月中的第几天,从1开始 |
DAY_OF_YEAR | 一年中的第几天 |
WEEK_OF_MONTH | 一月中第几个星期 |
WEEK_OF_YEAR | 一年中第几个星期 |
下面的【例10_06】演示了如何通过get()方法获得时间分量。
【例10_06 获得时间分量】
Exam10_06.java
import java.util.Calendar;
public class Exam10_06 {
public static void main(String[] args){
Calendar c = Calendar.getInstance();
//设置时间为2022年2月9日16点15分55秒
c.set(2022,1,9,16,15,55);
System.out.println("年:"+c.get(Calendar.YEAR));
System.out.println("月:"+c.get(Calendar.MONTH));
System.out.println("日:"+c.get(Calendar.DAY_OF_MONTH));
System.out.println("星期:"+c.get(Calendar.DAY_OF_WEEK));
System.out.println("时:"+c.get(Calendar.HOUR_OF_DAY));
System.out.println("分:"+c.get(Calendar.MINUTE));
System.out.println("秒:"+c.get(Calendar.SECOND));
}
}
【例10_06】的运行结果如图10-4所示。
图10-4 【例10_06】运行结果
从图10-4可以看出:通过get()方法所获得的月份值与实际与实际月份偏差了1,而星期的数值也与实际不符,这是因为在Calendar类中用数字1表示星期天,数字2表示星期一,以此类推直到星期六。读者在实际开发过程中不要忘记修正这两个偏差。
10.2.3日期时间的计算
Calendar类除了能够获得时间分量外,还可以对日期时间进行简单的计算,它的add()方法可以对当前对象的某个时间分量进行加减从而计算出一个新的日期时间。add()方法有两个参数,第一个参数用来指定进行加减的时间分量,第二个参数指定加减的数值。如果是计算某时间之后的日期时间,就把add()方法的第二个参数设为正数,反之,如果计算之前的日期时间,就把第二个参数设为负数。下面的【例10_07】展示了如何使用add()方法在当前对象的基础上计算出一个新的日期时间。
【例10_07 计算日期时间】
Exam10_07.java
import java.util.Calendar;
public class Exam10_07 {
public static void main(String[] args){
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
Calendar c3 = Calendar.getInstance();
//把c1、c2、c3都设置为2022年1月1日
c1.set(2022,0,1);
c2.set(2022,0,1);
c3.set(2022,0,1);
c1.add(Calendar.DATE,14);//计算14天后的日期
c2.add(Calendar.WEEK_OF_MONTH,14);//计算14周后的日期
c3.add(Calendar.MONTH,14);//计算14月后的日期
System.out.print("14天后的日期为:"+c1.get(Calendar.YEAR)+"年");
System.out.print(""+(c1.get(Calendar.MONTH)+1)+"月");
System.out.println(""+c1.get(Calendar.DAY_OF_MONTH)+"日");
System.out.print("14周后的日期为:"+c2.get(Calendar.YEAR)+"年");
System.out.print(""+(c2.get(Calendar.MONTH)+1)+"月");
System.out.println(""+c2.get(Calendar.DAY_OF_MONTH)+"日");
System.out.print("14月后的日期为:"+c3.get(Calendar.YEAR)+"年");
System.out.print(""+(c3.get(Calendar.MONTH)+1)+"月");
System.out.println(""+c3.get(Calendar.DAY_OF_MONTH)+"日");
}
}
【例10_07】中c1、c2、c3这3个对象都代表2022年1月1日,程序中使用add()方法在这个日期的基础上分别增加了14天、14周和14个月。可以看到:这三次计算为add()方法所传递的第一个参数分别是Calendar.DATE、Calendar.WEEK_OF_MONTH、Calendar.MONTH,这三个参数分别代表天、星期和月这三个时间分量。需要特别说明:代表周的时间分量是Calendar.WEEK_OF_MONTH而不是Calendar.DAY_OF_WEEK。【例10_07】的运行结果如图10-5所示。
图10-5【例10_07】的运行结果
各位读者可以根据图10-5所示的运行结果自行验算add()方法的计算结果。
本文字版教程还配有更详细的视频讲解,小伙伴们可以点击这里观看。