java怎么取日期的月份
- 后端开发
- 2025-08-14
- 34
Calendar类的
get(Calendar.MONTH)或Java 8+的
LocalDate.getMonth()获取月份(均从0开始,需+1得实际月份
在Java编程中,获取日期中的月份是一个常见需求,但由于Java提供了多种日期时间API(如 java.util.Date/Calendar、java.time 包下的现代API),不同方案实现方式差异较大,以下将从核心原理、具体实现、注意事项、对比分析四个维度展开详解,并附完整示例代码与常见问题解答。
主流实现方式及原理
传统方案:基于 Calendar 类(兼容旧版JDK)
这是Java 8之前的主流做法,核心逻辑是通过 Calendar 对象拆解 Date 对象的时间字段,关键步骤如下:
- 步骤1:创建
Date对象(可表示当前时间或指定时间) - 步骤2:通过
Calendar.getInstance()获取日历实例 - 步骤3:调用
calendar.setTime(date)同步时间 - 步骤4:使用
calendar.get(Calendar.MONTH)获取月份值
️ 重要特性:返回值为 0~11(一月=0,十二月=11),需手动+1转换为自然月份。
示例代码:
import java.util.Date;
import java.util.Calendar;
public class TraditionalDemo {
public static void main(String[] args) {
// 方式1:获取当前时间的月份
Date now = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(now);
int monthZeroBased = calendar.get(Calendar.MONTH); // 0~11
int naturalMonth = monthZeroBased + 1; // 转为1~12
System.out.println("当前月份(自然月):" + naturalMonth);
// 方式2:解析特定日期字符串
try {
Date birthDate = new SimpleDateFormat("yyyy-MM-dd").parse("1995-08-15");
calendar.setTime(birthDate);
System.out.println("生日所在月份:" + (calendar.get(Calendar.MONTH)+1));
} catch (Exception e) {
e.printStackTrace();
}
}
}
Java 8+ 推荐方案:java.time.LocalDate(线程安全且功能更强)
自Java 8起,推荐使用全新的 java.time API,LocalDate 专门用于处理无时区的日期,其优势在于:
不可变对象,天然线程安全
语义化方法命名(如 getMonth())
直接返回 Month 枚举或整型数值

两种获取方式:
| 方法 | 返回类型 | 特点 |
|——|———-|——|
| localDate.getMonth() | Month 枚举 | 如 MONTH.AUGUST |
| localDate.getMonthValue() | int | 返回1~12的自然月 |
示例代码:
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.Month;
public class ModernDemo {
public static void main(String[] args) {
// 获取当前日期的月份
LocalDate today = LocalDate.now();
Month monthEnum = today.getMonth(); // 枚举类型
int monthNumber = today.getMonthValue(); // 1~12
System.out.println("当前月份(枚举):" + monthEnum);
System.out.println("当前月份(数字):" + monthNumber);
// 解析自定义日期字符串
String dateStr = "2023-12-25";
LocalDate ChristmasDay = LocalDate.parse(dateStr);
System.out.println("圣诞节所在月份:" + ChristmasDay.getMonthValue());
}
}
特殊场景:从字符串解析日期并提取月份
当面对非标准格式的日期字符串时,需先定义解析规则:

- 旧版方案:使用
SimpleDateFormat配合Calendar - 新版方案:使用
DateTimeFormatter配合LocalDate
对比示例:
| 方案 | 代码片段 | 优点 | 缺点 |
|——|———-|——|——|
| 旧版 | new SimpleDateFormat("dd/MM/yyyy").parse(str) | 简单易用 | 线程不安全,格式符大小写敏感 |
| 新版 | LocalDate.parse(str, DateTimeFormatter.ofPattern("dd/MM/yyyy")) | 线程安全,链式调用 | 需熟悉新模式语法 |
关键差异对比表
| 特性 | Calendar + Date |
LocalDate |
|---|---|---|
| 所属包 | java.util |
java.time |
| 线程安全 | 非线程安全(需外部同步) | 不可变对象 |
| 月份范围 | 0~11(需+1转换) | 1~12(直接可用) |
| 空值处理 | 不允许为null | 允许Optional包装 |
| 国际化支持 | 有限 | 完善(内置多语言格式化) |
| 推荐程度 | 仅维护旧项目使用 | 新项目首选 |
典型错误与解决方案
错误1:忘记给 Calendar.MONTH 加1
// 错误写法:直接输出会导致1月显示为0 System.out.println(calendar.get(Calendar.MONTH)); // 正确写法:+1转换为自然月 System.out.println(calendar.get(Calendar.MONTH) + 1);
错误2:混淆 Month 枚举与整型值
// 错误:试图将枚举赋值给int变量 int wrong = today.getMonth(); // 编译错误! // 正确:使用getMonthValue()获取数字 int correct = today.getMonthValue();
错误3:时区导致的月份偏差
// 若系统默认时区非东八区,可能导致日期计算错误
LocalDate ldt = LocalDate.now(); // 依赖系统时区
// 解决方案:显式指定时区
ZoneId zone = ZoneId.of("Asia/Shanghai");
LocalDate shDate = LocalDate.now(zone);
完整应用示例(含异常处理)
import java.time.;
import java.time.format.DateTimeParseException;
public class FullExample {
public static void main(String[] args) {
// 场景1:获取当前月份(推荐写法)
printCurrentMonth();
// 场景2:解析用户输入的生日日期
parseBirthday("1999-05-20"); // 正确格式
parseBirthday("invalid-date"); // 触发异常
}
private static void printCurrentMonth() {
LocalDate today = LocalDate.now();
System.out.println("今天是:" + today);
System.out.println("月份名称:" + today.getMonth());
System.out.println("月份数字:" + today.getMonthValue());
}
private static void parseBirthday(String dateStr) {
try {
LocalDate birthday = LocalDate.parse(dateStr);
System.out.println(dateStr + " 的月份是:" + birthday.getMonthValue());
} catch (DateTimeParseException e) {
System.err.println("日期格式错误: " + dateStr);
}
}
}
相关问答FAQs
Q1: 为什么我用 Calendar 获取的月份总是比实际少1?
A: 因为 Calendar 内部采用0基索引(一月=0,十二月=11),解决方法是在获取结果后加1:calendar.get(Calendar.MONTH) + 1,推荐改用 LocalDate 避免此类问题。
Q2: 如何从”2023-04-15″这样的字符串中提取月份?
A: 使用 LocalDate.parse() 配合标准格式:

String dateStr = "2023-04-15"; LocalDate date = LocalDate.parse(dateStr); // ISO格式自动识别 int month = date.getMonthValue(); // 输出4
若格式非标准则需自定义解析器:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate date = LocalDate.parse(dateStr, formatter);
