Java Calendar日历类的用法(附带实例)
打开 Java API 文档可以看到,java.util.Date 类提供的大部分方法都已经过时了,因为 Date 类在设计之初没有考虑到国际化,而且很多方法也不能满足用户需求,比如需要获取指定时间的年月日时分秒信息,或者想要对日期时间进行加减运算等复杂的操作,Date 类已经不能胜任,因此 JDK 提供了新的时间处理类—Calendar 日历类。
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOU R等日历字段之间的转换提供了一些方法,并为操作日历字段(如获得下星期的日期)提供了一些方法。
另外,Calendar 类还为实现包范围外的具体日历系统提供了其他字段和方法,这些字段和方法被定义为 protected。
Calendar 提供了一个类方法 getInstance(),以获得此类型的一个通用的对象。Calendar 类的 getInstance() 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化,其使用方法如下:
Calendar 类提供的常用字段及其说明如下表所示:
Calendar 类提供的常用方法及其说明如下表所示:
从表中可以看到,add() 方法和 roll() 方法都用来为给定的日历字段添加或减去指定的时间量,它们的主要区别在于:
【实例】今天离中华人民共和国成立 100 周年差多少天。创建 CountDown 类,通过 Calendar 类和 Date 类计算出 2049 年 10 月 1 日距今相差的毫秒数,根据毫秒数计算出相差的天数。
最后对 Calendar 类的使用做出几点总结:
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOU R等日历字段之间的转换提供了一些方法,并为操作日历字段(如获得下星期的日期)提供了一些方法。
另外,Calendar 类还为实现包范围外的具体日历系统提供了其他字段和方法,这些字段和方法被定义为 protected。
Calendar 提供了一个类方法 getInstance(),以获得此类型的一个通用的对象。Calendar 类的 getInstance() 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化,其使用方法如下:
Calendar rightNow = Calendar.getInstance();由于 Calendar 类是一个抽象类,不能用 new 创建实例对象,因此只能使用 getInstance() 方法创建该类的实例对象。如果需要创建 Calendar 类的对象,必须使用其子类,如 GregorianCalendar 类。
Calendar 类提供的常用字段及其说明如下表所示:
字段名 | 说明 |
---|---|
DATE | get 和 set 的字段数字,指示一个月中的某天 |
DAY_OF_MONTH | get 和 set 的字段数字,指示一个月中的某天 |
DAY_OF_WEEK | get 和 set 的字段数字,指示一个星期中的某天 |
DAY_OF_WEEK_IN_MONTH | get 和 set 的字段数字,指示当前月中的第几个星期 |
DAY_OF_YEAR | get 和 set 的字段数字,指示当前年中的天数 |
HOUR | get 和 set 的字段数字,指示上午或下午的小时 |
HOUR_OF_DAY | get 和 set 的字段数字,指示一天中的小时 |
MILLISECOND | get 和 set 的字段数字,指示一秒中的毫秒 |
MINUTE | get 和 set 的字段数字,指示一小时中的分钟 |
MONTH | 指示月份的 get 和 set 的字段数字 |
SECOND | get 和 set 的字段数字,指示一分钟中的秒 |
time | 日历的当前设置时间,以毫秒为单位,表示自格林威治标准时间 1970 年 1 月 1 日 0:00:00 后经过的时间 |
WEEK_OF_MONTH | get 和 set 的字段数字,指示当前月中的星期数 |
WEEK_OF_YEAR | get 和 set 的字段数字,指示当前年中的星期数 |
YEAR | 指示年的 get 和 set 的字段数字 |
Calendar 类提供的常用方法及其说明如下表所示:
方法 | 说明 |
---|---|
add(int field, int amount) | 根据日历的规则,为给定的日历字段添加或减去指定的时间量 |
after(Object when) | 判断此 Calendar 对象表示的时间是否在指定 Object 表示的时间之后,返回判断结果 |
before(Object when) | 判断此 Calendar 对象表示的时间是否在指定 Object 表示的时间之前,返回判断结果 |
get(int field) | 返回给定日历字段的值 |
getInstance() | 使用默认时区和语言环境获得一个日历 |
getTime() | 返回一个表示此 Calendar 对象时间值(从历元至现在的毫秒偏移量)的 Date 对象 |
getTimeInMillis() | 返回此 Calendar 对象的时间值,以毫秒为单位 |
roll(int field, boolean up) | 在给定的时间字段上添加或减去(上/下)单个时间单元,不更改更大的字段 |
set(int field, int value) | 将给定的日历字段设置为给定值 |
set(int year, int month, int date) | 设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值 |
set(int year, int month, int date, int hourOfDay, int minute) | 设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值 |
set(int year, int month, int date, int hourOfDay, int minute, int second) | 设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY、MINUTE 和 SECOND 的值 |
setTime(Date date) | 使用给定的 Date 对象设置此 Calendar 对象的时间 |
setTimeInMillis(long millis) | 用给定的 long 值设置此 Calendar 对象的当前时间值 |
从表中可以看到,add() 方法和 roll() 方法都用来为给定的日历字段添加或减去指定的时间量,它们的主要区别在于:
- 使用 add() 方法会影响大的字段,像数学里加法的进位或错位;
- 使用 roll() 方法设置的日期字段只是进行增加或减少,不会改变更大的字段。
【实例】今天离中华人民共和国成立 100 周年差多少天。创建 CountDown 类,通过 Calendar 类和 Date 类计算出 2049 年 10 月 1 日距今相差的毫秒数,根据毫秒数计算出相差的天数。
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class CountDown { public static void main(String[] args) { System.out.println("——中华人民共和国成立100周年倒计时——"); Date date = new Date(); // 当前时间 // 创建 SimpleDateFormat 对象,指定目标格式 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy 年 MM 月 dd 日"); // 调用 format 方法,格式化时间,转换为指定格式 String today = simpleDateFormat.format(date); System.out.println("今天是" + today); // 输出当前日期 // 获取自 1970 年 1 月 1 日至当前时间所经过的毫秒数 long time1 = date.getTime(); // 使用默认时区和语言环境获得一个日历 calendar Calendar calendar = Calendar.getInstance(); // 设置日历 calendar 的年、月和日的值。因为月份是从 0 开始计算的,所以这里要减 1 calendar.set(2049, 10 - 1, 1); // 计算自 1970 年 1 月 1 日至 2049 年 10 月 1 日所经过的毫秒数 long time2 = calendar.getTimeInMillis(); // 计算 2049 年 10 月 1 日距离当前时间相差的天数 long day = (time2 - time1) / (1000 * 60 * 60 * 24); System.out.println("距离2049年10月1日还有" + day + "天!"); } }——中华人民共和国成立100周年倒计时——
今天是 2025 年 04 月 23 日
距离 2049 年 10 月 1 日还有 8927 天!
最后对 Calendar 类的使用做出几点总结:
- c.set(Calendar.DAY_OF_MONTH, 0) 获取的是上个月的最后一天,因此调用前需要将月份往后加一个月。
- Calendar.MONTH 的第一个月是使用 0 记录的,因此在获得月份数字后要加 1。年和日是从 1 开始记录的,不需要加 1。
- Calendar.DAY_OF_WEEK 的第一天是周日,周一是第二天,周六是最后一天。