功能包介绍 : calendar

是算法比赛中常用的功能包,我们一起来分享一下~

为此建立了一个专门搜集我不太熟悉的包来和大家一起学习.

核心需求是详细掌握Java中Calendar类的用法,尤其是能应对蓝桥杯中常见的日期计算类题目(比如日期偏移、月份天数、闰年判断、日期差计算等)。下面我会从基础到实战,结合蓝桥杯考点详细讲解Calendar的使用。

一、Calendar类基础认知

Calendarjava.util包下的抽象类 ,不能直接通过new实例化,必须通过Calendar.getInstance()获取实例(默认对应当前系统时区/地区的日历)。它是蓝桥杯中处理日期问题的核心工具,比Date类更灵活,能轻松实现日期的加减、字段获取/设置等操作。

二、核心API详解(结合蓝桥杯考点)

1. 实例化Calendar对象

这是使用Calendar的第一步,通过getInstance()获取当前系统时间的实例,也可指定时区/地区(蓝桥杯一般用默认)。

java 复制代码
import java.util.Calendar;

public class CalendarBasic {
    public static void main(String[] args) {
        // 获取默认Calendar实例(当前系统时间)
        Calendar cal = Calendar.getInstance();
        // 转换为Date对象输出(直观查看时间)
        System.out.println("当前时间:" + cal.getTime());
    }
}

2. get()方法:获取日期字段(蓝桥杯易错点)

get(int field)用于获取日期的指定字段,核心字段常量及注意事项如下(⚠️ 蓝桥杯高频坑点):

常量 含义 注意事项
Calendar.YEAR 年份 无(直接获取数字年份,如2024)
Calendar.MONTH 月份 0=1月,11=12月(必须+1才是实际月份)
Calendar.DATE 当月日期(同DAY_OF_MONTH) 无(1-31)
Calendar.DAY_OF_WEEK 星期 1=周日,2=周一,...7=周六(需转换为常规格式)
Calendar.HOUR_OF_DAY 24小时制小时 0-23(蓝桥杯时间计算常用)
Calendar.DAY_OF_YEAR 一年中的第几天 1-365/366(闰年判断辅助)

代码示例(解决易错点)

java 复制代码
import java.util.Calendar;

public class CalendarGetDemo {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        
        // 获取核心字段(处理易错点)
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH) + 1; // 月份+1
        int day = cal.get(Calendar.DATE);
        // 星期转换:1(周日)→"周日",2(周一)→"周一"...
        String week = switch (cal.get(Calendar.DAY_OF_WEEK)) {
            case 1 -> "周日";
            case 2 -> "周一";
            case 3 -> "周二";
            case 4 -> "周三";
            case 5 -> "周四";
            case 6 -> "周五";
            case 7 -> "周六";
            default -> "";
        };
        
        System.out.printf("当前时间:%d年%d月%d日 %s%n", year, month, day, week);
    }
}

3. set()方法:设置日期字段

用于手动设置日期的指定字段,支持单个字段设置批量设置,注意月份参数仍为0开始。

java 复制代码
import java.util.Calendar;

public class CalendarSetDemo {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        
        // 方式1:单个字段设置(设置为2024年2月)
        cal.set(Calendar.YEAR, 2024);
        cal.set(Calendar.MONTH, 1); // 1=2月
        
        // 方式2:批量设置(2024年5月20日)
        cal.set(2024, 4, 20); // 4=5月
        
        // 输出验证
        System.out.printf("设置后的日期:%d年%d月%d日%n",
                cal.get(Calendar.YEAR),
                cal.get(Calendar.MONTH) + 1,
                cal.get(Calendar.DATE));
    }
}

4. add()方法:日期偏移(蓝桥杯高频考点)

add(int field, int amount)用于对日期字段进行加减偏移,会自动处理进位(比如12月+1个月→次年1月),是蓝桥杯"n天后/前的日期"类题目的核心方法。

示例:计算100天后的日期

java 复制代码
import java.util.Calendar;

public class CalendarAddDemo {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        System.out.println("当前日期:" + cal.getTime());
        
        // 加100天(正数加,负数减)
        cal.add(Calendar.DAY_OF_MONTH, 100);
        
        // 输出结果
        System.out.printf("100天后:%d年%d月%d日%n",
                cal.get(Calendar.YEAR),
                cal.get(Calendar.MONTH) + 1,
                cal.get(Calendar.DATE));
    }
}

5. getActualMaximum():获取字段最大值(蓝桥杯必考)

getActualMaximum(int field)用于获取指定字段的实际最大值,比如"当月天数""2月天数(判断闰年)",是蓝桥杯日期题的核心技巧。

示例:获取月份天数+判断闰年

java 复制代码
import java.util.Calendar;

public class CalendarMaxDemo {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        
        // 1. 获取当前月的天数
        int daysOfMonth = cal.getActualMaximum(Calendar.DATE);
        System.out.printf("当前月(%d月)天数:%d%n", cal.get(Calendar.MONTH)+1, daysOfMonth);
        
        // 2. 判断闰年(核心:2月有29天则为闰年)
        cal.set(Calendar.MONTH, 1); // 切换到2月(1=2月)
        int daysOfFeb = cal.getActualMaximum(Calendar.DATE);
        if (daysOfFeb == 29) {
            System.out.printf("%d年是闰年%n", cal.get(Calendar.YEAR));
        } else {
            System.out.printf("%d年不是闰年%n", cal.get(Calendar.YEAR));
        }
    }
}

6. 蓝桥杯实战:计算两个日期的天数差

核心思路:将Calendar转换为毫秒数,通过差值计算天数(1天=86400000毫秒)。

java 复制代码
import java.util.Calendar;

public class CalendarDaysDiff {
    public static void main(String[] args) {
        // 日期1:2024年1月1日
        Calendar cal1 = Calendar.getInstance();
        cal1.set(2024, 0, 1); // 0=1月
        
        // 日期2:2024年12月31日
        Calendar cal2 = Calendar.getInstance();
        cal2.set(2024, 11, 31); // 11=12月
        
        // 转换为毫秒数
        long time1 = cal1.getTimeInMillis();
        long time2 = cal2.getTimeInMillis();
        
        // 计算天数差(绝对值避免顺序问题)
        long daysDiff = Math.abs((time2 - time1) / 86400000L);
        
        System.out.printf("2024-01-01到2024-12-31的天数:%d天%n", daysDiff);
    }
}

三、总结

关键点回顾

  1. Calendar是抽象类,必须通过Calendar.getInstance()实例化,是蓝桥杯日期题的核心工具。
  2. 核心易错点:月份从0开始(1月=0)、星期从1开始(周日=1),这是蓝桥杯常考的"坑点",必须手动修正。
  3. 高频方法:get()(获取字段)、set()(设置日期)、add()(日期偏移)、getActualMaximum()(判断闰年/月份天数)。

掌握以上内容,足以应对蓝桥杯中绝大多数Calendar相关的日期计算题目,建议结合真题多练习,重点注意月份和星期的偏移修正。

相关推荐
二川bro2 小时前
Java集合类框架的基本接口有哪些?
java·开发语言·python
菜鸟233号2 小时前
力扣213 打家劫舍II java实现
java·数据结构·算法·leetcode
panzer_maus2 小时前
Redis简单介绍(3)-持久化的实现
java·redis·mybatis
毕设源码-邱学长3 小时前
【开题答辩全过程】以 民宿在线预定平台的设计与实现为例,包含答辩的问题和答案
java·eclipse
不会Android的潘潘3 小时前
受限系统环境下的 WebView 能力演进:车载平台 Web 渲染异常的根因分析与优化实践
android·java·前端·aosp
建军啊3 小时前
java web常见lou洞
android·java·前端
阳无3 小时前
宝塔部署的前后端项目从IP访问改成自定义域名访问
java·前端·部署
Pluchon3 小时前
硅基计划4.0 算法 动态规划进阶
java·数据结构·算法·动态规划
会游泳的石头3 小时前
Java 异步事务完成后的监听器:原理、实现与应用场景
java·开发语言·数据库