Calendar的用法

java.util.Calendar类是一个抽象类

实现日期和日历字段之间的转换,并为操作日历字段提供一些方法

一、常用字段

// 源码 static final
public static final int YEAR = 1;  // 年
public static final int MONTH = 2; // 月 一月的值是 0,二月的值是 1
public static final int DATE = 5;  // 日

public static final int HOUR = 10;        // 小时 12小时制
public static final int HOUR_OF_DAY = 11; // 小时 24小时制
public static final int MINUTE = 12;      // 分钟
public static final int SECOND = 13;      // 秒值

public static final int DAY_OF_WEEK = 7;  // 星期 周日的值是 1,周一的值是 2

public static final int DAY_OF_YEAR = 6;  // 年内第几天
public static final int DAY_OF_MONTH = 5; // 月内第几天 同DATE

二、常用方法

public static Calendar getInstance() // 使用默认时区和语言环境获得一个日历
    
public int get(int field)            // 获取日历字段的值  
public void set(int field,int value) // 设置日历字段的值 
public final void set(int year,int month,int date)    
public final void set(int year,int month,int date,int hourOfDay,int minute)    
public final void set(int year,int month,int date,int hourOfDay,int minute,int second) 

// amount是正数表示增加;amount是负数表示减少
public abstract void add(int field,int amount) // 日历字段添加有符号的时间量,会更改更大的字段
public void roll(int field, int amount)        // 日历字段添加有符号的时间量,不更改更大的字段
                         
public final Date getTime()            // 将日历对象转换为Date对象
public final void setTime(Date date)   // 使用Date设置此日历的时间
   
public long getTimeInMillis() // 返回此 Calendar 的时间值,以毫秒为单位  

三、练习使用

Calendar 类内部使用一组 int 类型的数组存储日历字段的值,例如年、月、日等

这些常量值被用作内部数组的索引,以便 Calendar 类能够知道操作的是哪个字段的值

这些常量值只是用于标识不同的日历字段,并不是直接引用 Calendar 对象的内部状态

  • set(int field,int value)add(int field,int amount)rool(int field,int amount)
  • 在实际使用中,传递的是Calendar类中定义的静态常量(如Calendar.YEARCalendar.DATE等)
        // 获得一个日历对象
        Calendar calendar = Calendar.getInstance();

        // 获取日历字段的值
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH) + 1; // 一月的值是0,二月的值是1
        int day = calendar.get(Calendar.DATE);
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        int minute = calendar.get(Calendar.MINUTE);
        int second = calendar.get(Calendar.SECOND);
        int weekday = calendar.get(Calendar.DAY_OF_WEEK) - 1; // 周日的值是1,周一的值是2
        weekday = weekday == 0 ? 7 : weekday;
        System.out.println(year + "年" + month + "月" + day + "日");
        System.out.println(hour + "时" + minute + "分" + second + "秒"
                + ",星期" + weekday);

        // 设置日历字段的值
        // YEAR MONTH DATE HOUR_OF_DAY MINUTE SECOND
		calendar.set(2026, 5, 30, 6, 6, 0); // 2026-06-30

        // 6月份没有31天 没有报错 自动变成7.1号
        // calendar.set(2026, 5, 31, 6, 6, 0); 

        // 日历字段添加时间量
        // calendar.add(Calendar.DATE, 1);  // 6.30 增加到 7.01

        // 日历字段滚动时间量
        // calendar.roll(Calendar.DATE, 1); // 6.30 滚动到 6.01

        // 将日历对象转换为日期对象
        Date date = calendar.getTime();
        System.out.println(date);           // Tue Jun 30 06:06:00 CST 2026

四、练习题

1、计算间隔天数

 		// 2012-09-01 ~ 2016-07-01
        Calendar calendar = Calendar.getInstance();
        calendar.set(2012, 8, 1); // 注意8表示9月
        long timeStart = calendar.getTimeInMillis();
        calendar.set(2016, 6, 1); // 注意6表示7月
        long timeEnd = calendar.getTimeInMillis();
        long dayCount = (timeEnd - timeStart) / (24 * 60 * 60 * 1000);
        System.out.println("间隔天数:" + dayCount); // 间隔天数:1399

2、计算出生天数

  		// 1999-09-01 ~ 2021-05-24
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, 1999);
        calendar.set(Calendar.MONTH, 9 - 1);
        calendar.set(Calendar.DATE, 1);
        long timeStart = calendar.getTimeInMillis();
        calendar.setTime(new Date());
        long timeEnd = calendar.getTimeInMillis();
        long dayCount = (timeEnd - timeStart) / (24 * 60 * 60 * 1000);
        System.out.println("出生天数:" + dayCount); // 出生天数:7936

3、前后滚动日期

        Calendar calendar = Calendar.getInstance(); 
        calendar.set(2022, 2, 10);    // 2022-03-10
		// 在月内,向后滚动25天
        calendar.roll(Calendar.DAY_OF_MONTH, 25);
        String dateStr1 = String.format("%tF(%<tA)", calendar);
        System.out.println(dateStr1); // 2022-03-04(星期五)
		// 在年内,再向后滚动31天
        calendar.roll(Calendar.DAY_OF_YEAR, 31);
        String dateStr2 = String.format("%tF(%<tA)", calendar);
        System.out.println(dateStr2); // 2022-04-04(星期一)

4、输出月份日历

// 日历类
public class CalendarBean {
    private int year;
    private int month;

    public void setYear(int year) {
        this.year = year;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    /**
     * 获取日历字符串数组
     *
     * @return
     */
    public String[] getCalendar() {
     
		// 4 * 7 = 28,31 - 28 = 3,分到第一行、最后一行
        String[] rili = new String[42]; // 最多6行,6*7=42

        /**
         * 判断月份天数
         */
        int dayCount = 0;
        if (month == 1 | month == 3 | month == 5 | month == 7 |
            month == 8 | month == 10 | month == 12) {
            dayCount = 31; // 大月天数
        }
        if (month == 4 | month == 6 | month == 9 | month == 11) {
            dayCount = 30; // 小月天数
        }
        if (month == 2) {
            // 闰年:年份能被400整除 或者 年份能被4整除但不能被100整除
            if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {
                dayCount = 29; // 二月天数
            } else {
                dayCount = 28;
            }
        }

        /**
         * 计算1号的星期
         */
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month - 1, 1);
        int weekday = calendar.get(Calendar.DAY_OF_WEEK) - 1;
        weekday = weekday == 0 ? 7 : weekday; // 2022-06-01 周三

        /**
         * 生成日历字符串数组
         */
        for (int i = 0; i < weekday; i++) {
            rili[i] = " "; // 前部分没有值
        }
        for (int i = weekday, day = 1; i < weekday + dayCount; i++, day++) {
            rili[i] = String.valueOf(day); // 中间部分有值 1-30
        }
        for (int i = weekday + dayCount; i < rili.length; i++) {
            rili[i] = " "; // 后部分没有值
        }
        return rili;
    }
}

// 启动类
class Main {
    public static void main(String[] args) {
        CalendarBean calendarBean = new CalendarBean();
        calendarBean.setYear(2022);
        calendarBean.setMonth(6);
        String[] rili = calendarBean.getCalendar();

        // 格式化日历表头
        char[] week = "日一二三四五六".toCharArray(); // 必须周日开头,前有三个空串
        for (char c : week) {
            System.out.printf("%-3c", c);
        }

        // 遍历打印日历字符串数组
        for (int i = 0; i < rili.length; i++) {
            if (i % 7 == 0) {
                System.out.println(); // 每7个一组,换一次行
            }
            System.out.printf("%-4s", rili[i]);
        }
    }
}

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼悠奕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值