
是算法比赛中常用的功能包,我们一起来分享一下~
为此建立了一个专门搜集我不太熟悉的包来和大家一起学习.
- 专栏入口 : 功能包
核心需求是详细掌握Java中Calendar类的用法,尤其是能应对蓝桥杯中常见的日期计算类题目(比如日期偏移、月份天数、闰年判断、日期差计算等)。下面我会从基础到实战,结合蓝桥杯考点详细讲解Calendar的使用。
一、Calendar类基础认知
Calendar是java.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);
}
}
三、总结
关键点回顾
Calendar是抽象类,必须通过Calendar.getInstance()实例化,是蓝桥杯日期题的核心工具。- 核心易错点:月份从0开始(1月=0)、星期从1开始(周日=1),这是蓝桥杯常考的"坑点",必须手动修正。
- 高频方法:
get()(获取字段)、set()(设置日期)、add()(日期偏移)、getActualMaximum()(判断闰年/月份天数)。
掌握以上内容,足以应对蓝桥杯中绝大多数Calendar相关的日期计算题目,建议结合真题多练习,重点注意月份和星期的偏移修正。