Java 中 Calendar 类用法总结
Calendar 是 Java 用于日期时间操作的抽象类,用来替代 Date 类的部分功能,可获取 / 设置年、月、日、时、分、秒、星期等。
1. 获取 Calendar 对象
Calendar calendar = Calendar.getInstance();
- 默认获取当前系统时间
- 是抽象类,不能直接
new
getInstance方法详解如下:


2. 常用字段(常量)
Calendar.YEAR:年Calendar.MONTH:月(0~11,0=1 月)Calendar.DAY_OF_MONTH/DATE:日Calendar.HOUR_OF_DAY:24 小时制Calendar.HOUR:12 小时制Calendar.MINUTE:分Calendar.SECOND:秒Calendar.DAY_OF_WEEK:星期(1 = 周日,2 = 周一…7 = 周六)
3. 获取时间字段
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
get方法详解:

4. 设置时间
Ⅰ.直接设置:
calendar.set(Calendar.YEAR, 2025);
calendar.set(2025, 11, 31); // 年,月(0~11),日
set方法详解:

Ⅱ.加减时间:
calendar.add(Calendar.DAY_OF_MONTH, 7); // 加7天
calendar.add(Calendar.MONTH, -1); // 减1个月
add方法详解:

5. 与 Date 互转
// Calendar → Date
Date date = calendar.getTime();
// Date → Calendar
calendar.setTime(date);
getTime方法和setTime方法详解:

6. 常见坑
- 月份从 0 开始:0 = 一月,11 = 十二月
- 星期从周日 = 1 开始
- 线程不安全,多线程不能共用一个 Calendar
7. 现代替代方案(Java 8+)
实际开发优先用:
LocalDate、LocalDateTime、LocalTimeDateTimeFormatter
更简洁、安全、无坑。
8.getTimeInMillis方法:Calendar对象表示的时间转换成毫秒

9.获取月份注意事项:
问题分析:Calendar 月份的「0 起始」坑->
Calendar 的月份是从 0 开始计数(输入0=1 月,输入1=2 月,…,输入11=12 月),
Ⅰ. 验证日期:
假设现在输入2026年3月8日,查询周几->2026 年 3 月 8 日:星期日(预期的日期)
Ⅱ. 错误代码定位:
int month=3;
calendar.set(2026,month+1,8); // 错误:month=3 → 3+1=4 → 对应5月
month=3本想表示 3 月,但 Calendar 中 3 月对应的常量是Calendar.MARCH = 2;- 你加 1 后变成 4,对应
Calendar.MAY = 4(5 月),所以日期完全错了。
Ⅲ. 修复后的完整代码:
package Test;
import java.util.Calendar;
import java.util.Date;
public class Practice1 {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
int month = 3; // 想设置3月
// 修复:月份需要减1(因为Calendar月份0起始)
calendar.set(2026, month - 1, 8);
Date d = new Date(calendar.getTimeInMillis());
System.out.println(d); // 输出:Sun Mar 08 16:xx:xx CST 2026(星期日,正确)
}
}
Ⅳ.总结:
- 核心问题:Calendar 月份是「0 起始」(输入0=1 月,输入11=12 月),代码中错误地给月份 + 1,导致日期从 3 月变成 5 月;
- 修复方案:设置 3 月时,要么用
month-1(month=3 → 2),要么直接用Calendar.MARCH; - 避坑建议:优先使用 Calendar 内置的月份常量(如
Calendar.JANUARY->直接1月、Calendar.MARCH),避免手动写数字出错。


2万+

被折叠的 条评论
为什么被折叠?



