由于Date类过于古老,许多的构造器和方法都已经过时。Java推荐使用Calendar类来完成时间计算等操作,Calendar类是一个抽象类,它无法被实例化,也就是说无法创建对象,而是通过调用静态方法getInstance()来获取一个日历。Calendar中还有很多与时间有关的常量(或者说字段、属性),例如年(Calendar.YEAR)、月(Calendar.MONTH)、日(Calendar.DAY_OF_MONTH)、时(Calendar.HOUR_OF_DAY)、分(Calendar.MINUTE)、秒(Calendar.SECOND)、星期(Calendar.DAY_OF_WEEK)等;其中小时(Calendar.HOUR_OF_DAY)是24小时制的,还有一个12小时制的(Calendar.HOUR),月份是按0~11算的,0代表1月,11代表12月,星期是星期天开始算起,算作一个星期的第一天,返回1,星期一返回2,……,星期六返回7。
下面说一下Calendar类的一些常用方法:
- getInstance():使用默认时区和语言环境获得一个日历。
- getTime():返回一个表示此 Calendar 时间值的 Date 对象。就是把日历转换成date对象。
- setTime():使用给定的 Date 设置此 Calendar 的时间。把date对象转换成日历。getTime()和setTime()可以用作Calendar类和Date 类之间的相互转换。
// getInstance():获取日历
Calendar calendar = Calendar.getInstance();
// getTime():获取时间,可以把日历转换成date对象
Date date = calendar.getTime() ;
System.out.println(date);
// setTime ():设置时间,可以把date对象转换成日历
Calendar. setTime(date);
System.out.println(Calendar.getTime());
输出结果如下:
- get(int field):返回给定日历字段的值。
// 月是从0开始算(0~11),所以需要+1
System.out.println("几月:" + (calendar .get(Calendar.MONTH) + 1) + "月");
// 这个是24小时制,Calendar.HOUR是12小时制
System.out.println("几点:" + calendar.get(Calendar.HOUR_OF_DAY) + "点");
//星期是从礼拜天开始算的,算作一个星期中的第一天,返回1,礼拜一返回2
System.out.println("一周中的第几天:第" +
(calendar.get(Calendar.DAY_OF_WEEK)) + "天");
输出结果如下:
5、set(int field, int value):将给定的日历字段设置为给定值。该方法有多个重载,可一次性设置年月日或者年月日时分秒,也可单独设置具体的某个字段。
calendar.set(2018, 5, 6);//设置为2018-06-06,不指定的部分将使用现在的时间
System.out.println(calendar.getTime());
calendar.set(Calendar.MONTH, 4);//设置月份为5月,可以使用数字
calendar.set(Calendar.MONTH, Calendar.MAY);// 也可以使用英文的单词
System.out.println(calendar.getTime());
输出结果如下:
6、add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。这个方法是正常算的,就是说它会更改更大的字段,比如5月3日减去4天就是4月29日,减去5个月就是去年年底,加法也一样。
calendar.add(Calendar.DATE, -4);// -4天
System.out.println(calendar.getTime());
7、roll(int field, int amount):向指定日历字段添加指定(有符号的)时间量,不更改更大的字段。这个方法和add一样也是添加或减去指定字段的时间量的,不过这个方法不会影响到别的字段,它只在指定的字段上做更改,比如说同样是5月3日减去4天,它就会变成5月30日,而不是4月29日,它只更改指定的日期字段而不更改月份字段,对月份字段不会有影响,加法也一样。
calendar.roll(Calendar.DATE, -4); // -4天
System.out.println(calendar.getTime());
输出结果如下: