java怎么取日期的月份
- 后端开发
- 2025-08-14
- 1
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);