Java Calendar类

参考资料

[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字段“进位”后变成22月没有31日,
// YEAR字段不会改变,20032月只有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());    //③
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值