Java如何快速获取当前月份?高效方法一网打尽!
- 后端开发
- 2025-05-29
- 5
在Java开发中,获取当前月份是一个基础但高频的需求,本文将通过代码示例和原理分析,详细讲解多种实现方式,帮助开发者根据项目需求灵活选择。

Java 8及以上版本推荐方案
Java 8引入的java.time包提供了更简洁、线程安全的日期处理方案:
// 获取数字月份(1-12) int currentMonth = LocalDate.now().getMonthValue(); // 获取英文月份名称(如JANUARY) String monthName = LocalDate.now().getMonth().name(); // 获取本地化月份名称(如"一月") String displayName = LocalDate.now().getMonth() .getDisplayName(TextStyle.FULL, Locale.CHINA);
特性优势:
- 直接返回1-12的整型数值
- 自动处理时区(默认系统时区)
- 支持国际化展示
- 避免Calendar类的线程安全问题
传统Java版本方案(Java 7及以下)
Calendar calendar = Calendar.getInstance(); int month = calendar.get(Calendar.MONTH) + 1; // 注意+1转换
注意事项:
- 返回0-11需要+1转换
- SimpleDateFormat方案(需注意线程安全问题): SimpleDateFormat sdf = new SimpleDateFormat("MM"); String monthStr = sdf.format(new Date()); // 返回01-12
处理特殊时区场景
// 指定时区获取月份 ZoneId tokyoZone = ZoneId.of("Asia/Tokyo"); int month = LocalDate.now(tokyoZone).getMonthValue(); // 兼容旧时区处理 Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+9"));
月份格式转换大全
| 需求场景 | 实现方案 | 输出示例 |
|---|---|---|
| 两位数字月份 | String.format("%02d", month) | “01” – “12” |
| 中文月份 | Month.of(month).getDisplayName(...) | “一月” |
| 季度计算 | (month-1)/3 + 1 | 1-4 |
| 带前后月份的上下文 | LocalDate.now().plusMonths(1) | 下个月日期对象 |
避坑指南
-
月份数值转换

- Calendar.MONTH返回0-11
- SimpleDateFormat(“M”)返回1-12
- 新旧API混用时需特别注意
-
时区一致性原则
- Web应用建议显式指定时区
- 分布式系统推荐使用UTC时间
-
性能优化建议
- DateTimeFormatter线程安全可复用
- 避免在循环中重复创建Calendar实例
完整示例代码
public class MonthDemo { public static void main(String[] args) { // Java 8+方案 System.out.println("当前月份(数字):" + LocalDate.now().getMonthValue()); System.out.println("英文月份:" + LocalDate.now().getMonth()); // 传统方案 Calendar cal = Calendar.getInstance(); System.out.println("Calendar方案:" + (cal.get(Calendar.MONTH) + 1)); // 时区处理 System.out.println("东京当前月:" + LocalDate.now(ZoneId.of("Asia/Tokyo")).getMonthValue()); } }
输出结果示例:
当前月份(数字):7 英文月份:JULY Calendar方案:7 东京当前月:7
引用说明:
本文代码示例基于Oracle官方Java文档实现,时区数据遵循IANA时区数据库,建议生产环境使用Java 8+版本的时间API以获得最佳实践支持。
