当前位置:首页 > 后端开发 > 正文

java怎么取日期的月份

Java可通过 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转换为自然月份。

示例代码

java怎么取日期的月份 第1张

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")) | 线程安全,链式调用 | 需熟悉新模式语法 |

java怎么取日期的月份 第2张


关键差异对比表

特性 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);

java怎么取日期的月份 第3张

0