首页 > 编程笔记 > Java笔记 阅读:9

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 rightNow = Calendar.getInstance();
由于 Calendar 类是一个抽象类,不能用 new 创建实例对象,因此只能使用 getInstance() 方法创建该类的实例对象。如果需要创建 Calendar 类的对象,必须使用其子类,如 GregorianCalendar 类。

Calendar 类提供的常用字段及其说明如下表所示:

表: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 类提供的常用方法及其说明如下表所示:

表: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() 方法都用来为给定的日历字段添加或减去指定的时间量,它们的主要区别在于:
【实例】今天离中华人民共和国成立 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 类的使用做出几点总结:

相关文章