Calendar 类是 Java 早期用于处理日期和时间的一个核心类(虽然现在推荐使用 java.time 包,但 Calendar 在遗留代码中仍然非常普遍)。get() 方法是 Calendar 类中最常用的方法之一,用于获取日历字段(如年、月、日、小时等)的值。

方法签名
get() 方法的签名非常简单:
public int get(int field)
- 参数:
int field,这是一个整数值,代表你想要获取的日历字段,这些字段在Calendar类中定义为静态常量。 - 返回值:
int,对应日历字段的当前值。
常用的日历字段 (Field)
这些字段是 Calendar 类中定义的 public static final int 常量,你需要使用它们来指定要获取哪个字段的值。
| 字段常量 | 值 | 含义 | 示例 (2025-10-27 15:30:00) |
|---|---|---|---|
YEAR |
1 | 年 | 2025 |
MONTH |
2 | 月 (重要!) | 9 (注意:0代表一月,11代表十二月) |
DAY_OF_MONTH |
5 | 月中的第几天 | 27 |
DAY_OF_WEEK |
7 | 周中的第几天 (周日为1,周六为7) | 6 (星期五) |
HOUR |
10 | 12小时制的小时 | 3 |
HOUR_OF_DAY |
11 | 24小时制的小时 | 15 |
MINUTE |
12 | 分钟 | 30 |
SECOND |
13 | 秒 | 0 |
MILLISECOND |
14 | 毫秒 | 0 |
AM_PM |
9 | 上/下午 (0=AM, 1=PM) | 1 (下午) |
⚠️ 特别注意:MONTH 字段
Calendar 中的 MONTH 字段是从 0 开始计数的,这是一个非常常见的陷阱!
0代表 一月1代表 二月11代表 十二月
当你用 get(Calendar.MONTH) 获取到值后,通常需要加 1 才能得到我们习惯的月份。

使用示例
下面是一个完整的示例,展示了如何使用 get() 方法获取各种日期和时间信息。
import java.util.Calendar;
public class CalendarGetExample {
public static void main(String[] args) {
// 1. 获取一个 Calendar 实例
// Calendar 是一个抽象类,通常使用 getInstance() 获取其子类(通常是 GregorianCalendar)的实例
Calendar calendar = Calendar.getInstance();
// 2. 使用 get() 方法获取各个字段的值
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH); // 注意:月份是从0开始的
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); // 1=周日, 2=周一, ..., 7=周六
int hour24 = calendar.get(Calendar.HOUR_OF_DAY); // 24小时制
int hour12 = calendar.get(Calendar.HOUR); // 12小时制
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
int ampm = calendar.get(Calendar.AM_PM); // 0=AM, 1=PM
// 3. 打印结果
System.out.println("当前日期和时间: " + calendar.getTime());
System.out.println("-----------------------------------");
System.out.println("年份: " + year);
System.out.println("月份 (Calendar内部值): " + month + " (实际月份是: " + (month + 1) + ")");
System.out.println("月中的第几天: " + dayOfMonth);
System.out.println("周中的第几天 (1=周日): " + dayOfWeek + " (" + getDayName(dayOfWeek) + ")");
System.out.println("-----------------------------------");
System.out.println("24小时制小时: " + hour24);
System.out.println("12小时制小时: " + hour12);
System.out.println("分钟: " + minute);
System.out.println("秒: " + second);
System.out.println("上午/下午 (0=AM, 1=PM): " + ampm + " (" + (ampm == Calendar.AM ? "AM" : "PM") + ")");
}
// 一个辅助方法,将数字星期转换为名称
private static String getDayName(int dayOfWeek) {
String[] days = {"", "周日", "周一", "周二", "周三", "周四", "周五", "周六"};
return days[dayOfWeek];
}
}
可能的输出:
当前日期和时间: Fri Oct 27 15:30:00 CST 2025
-----------------------------------
年份: 2025
月份 (Calendar内部值): 9 (实际月份是: 10)
月中的第几天: 27
周中的第几天 (1=周日): 6 (周五)
-----------------------------------
24小时制小时: 15
12小时制小时: 3
分钟: 30
秒: 0
上午/下午 (0=AM, 1=PM): 1 (PM)
与现代 Java 8+ java.time 包的对比
虽然 Calendar 仍然可用,但从 Java 8 开始,官方推荐使用 java.time 包中的类,因为它们更直观、更不容易出错,并且是不可变的(线程安全)。
使用 java.time 的 LocalDateTime 来实现同样的功能:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.DayOfWeek;
public class JavaTimeExample {
public static void main(String[] args) {
// 1. 获取当前日期和时间
LocalDateTime now = LocalDateTime.now();
// 2. 获取各个字段的值
int year = now.getYear();
int month = now.getMonthValue(); // 直接得到 1-12 的值,无需加1!
int dayOfMonth = now.getDayOfMonth();
DayOfWeek dayOfWeek = now.getDayOfWeek(); // 返回的是枚举类型,更安全
int hour24 = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
// 3. 打印结果
System.out.println("当前日期和时间: " + now.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
System.out.println("-----------------------------------");
System.out.println("年份: " + year);
System.out.println("月份: " + month); // 无需加1,非常直观
System.out.println("月中的第几天: " + dayOfMonth);
System.out.println("周中的第几天: " + dayOfWeek); // 直接输出枚举名称,如 FRIDAY
System.out.println("-----------------------------------");
System.out.println("24小时制小时: " + hour24);
System.out.println("分钟: " + minute);
System.out.println("秒: " + second);
}
}
对比总结:
| 特性 | java.util.Calendar |
java.time.LocalDateTime |
|---|---|---|
| 月份 | 从 0 开始,需要加1 | 从 1 开始,直观 |
| 星期 | 返回数字 (1=周日) | 返回 DayOfWeek 枚举,更安全 |
| 可变性 | 可变,线程不安全 | 不可变,线程安全 |
| API 设计 | 混乱,很多方法名不直观 | 清晰、一致、符合 fluent API 风格 |
| 推荐度 | 遗留代码,不推荐新项目使用 | 强烈推荐,Java 8+ 的标准 |
calendar.get(field)是从Calendar对象中提取特定日期或时间部分(如年、月、日)的核心方法。- 关键点:参数
field必须是Calendar类中定义的静态常量(如Calendar.YEAR)。 - 最大陷阱:
Calendar.MONTH返回的值是 0-11,而不是 1-12,需要手动加1才能得到常规月份。 - 最佳实践:对于所有新的 Java 项目,请优先使用
java.time包,它提供了更现代、更安全、更易用的 API。
