参考资料
[1]. 疯狂Java讲义(第三版) 李刚
概述
Calendar类是一个抽象类,它是所有日历类的模板,并提供了一些所有日历通用的方法;但它本身不能直接实例化,程序只能创建Calendar子类的实例,Java本身提供了一个GregorianCalendar类,一个代表格里高利日历的子类,它代表了通常所说的公历。
Calendar与Date类的相互转换
// 创建一个默认的Calendar对象
Calendar calendar = Calendar.getInstance();
// 从Calendar对象中取出的Date对象
Date date = calendar.getTime();
// 通过Date对象获取对象的Calendar对象
// 因为Calendar/GregorianCalendar没有构造函数可以接收Date对象
// 所以必须先获得一个Calendar实例,然后调用其setTime()方法
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date);
Calendar类的用法
Calendar c = Calendar.getInstance();
// 取出年
System.out.println(c.get(YEAR));
// 取出月份
System.out.println(c.get(MONTH));
// 取出日
System.out.println(c.get(DATE));
// 分别设置年、月、日、小时、分钟、秒
c.set(2003 , 10 , 23 , 12, 32, 23); //2003-11-23 12:32:23
System.out.println(c.getTime());
// 将Calendar的年前推1年
c.add(YEAR , -1); //2002-11-23 12:32:23
System.out.println(c.getTime());
// 将Calendar的月前推8个月
c.roll(MONTH , -8); //2002-03-23 12:32:23
System.out.println(c.getTime());
Calendar cal1 = Calendar.getInstance();
cal1.set(2003, 7, 23, 0, 0 , 0); // 2003-8-23
cal1.add(MONTH, 6); //2003-8-23 => 2004-2-23
System.out.println(cal1.getTime());
Calendar cal2 = Calendar.getInstance();
cal2.set(2003, 7, 31, 0, 0 , 0); // 2003-8-31
// 因为进位到后月份改为2月,2月没有31日,自动变成29日
cal2.add(MONTH, 6); // 2003-8-31 => 2004-2-29
System.out.println(cal2.getTime());
Calendar cal3 = Calendar.getInstance();
cal3.set(2003, 7, 23, 0, 0 , 0); //2003-8-23
// MONTH字段“进位”,但YEAR字段并不增加
cal3.roll(MONTH, 6); //2003-8-23 => 2003-2-23
System.out.println(cal3.getTime());
Calendar cal4 = Calendar.getInstance();
cal4.set(2003, 7, 31, 0, 0 , 0); //2003-8-31
// MONTH字段“进位”后变成2,2月没有31日,
// YEAR字段不会改变,2003年2月只有28天
cal4.roll(MONTH, 6); //2003-8-31 => 2003-2-28
System.out.println(cal4.getTime());
add与roll的区别
add方法总体时间会跟着一起增长
Calendar cal1 = Calendar.getInstance();
// 设置时间
cal1.set(2003, 7, 23, 0, 0, 0);// 2003-8-23
// 增加6个月
cal1.add(Calendar.MONTH, 6);// 2004-4-23
// 减少6个月
cal1.add(Calendar.MONTH, -6);// 2003-8-23
roll方法
Calendar cal3 = Calendar.getInstance();
cal3.set(2003, 7, 23, 0, 0, 0);// 2003-8-23
cal3.roll(MONTH, 6);// 2003-2-23
设置Calendar的容错性
Calendar cal = Calendar.getInstance();
// 结果是YEAR字段加1,MONTH字段为1(二月)
cal.set(MONTH , 13); //①
System.out.println(cal.getTime());
// 关闭容错性后,不允许增加的月超过当年
cal.setLenient(false);
// 导致运行时异常
cal.set(MONTH , 13); //②
System.out.println(cal.getTime());
set()方法延迟修改
使用set修改后不会立即计算时间,直到再次使用Calendar的相关方法后,才会一起执行。
Calendar cal = Calendar.getInstance();
cal.set(2003 , 7 , 31); //2003-8-31
// 将月份设为9,但9月31日不存在。
// 如果立即修改,系统将会把cal自动调整到10月1日。
cal.set(MONTH , 8);
// 下面代码输出10月1日
// System.out.println(cal.getTime()); //①
// 设置DATE字段为5
cal.set(DATE , 5); //②
System.out.println(cal.getTime()); //③