在 Java 中,获取某个月的最后一天有几种常见的方法,这里介绍几种主流且推荐的方式,从现代的 Java 8+ API 到传统的 Calendar 类。

使用 Java 8+ 的 java.time API (推荐)
这是目前最推荐、最简洁、最安全的方法。java.time API 是 Java 8 引入的,专门用于处理日期和时间,它解决了旧 Date 和 Calendar 类的许多设计缺陷。
核心思路
- 创建一个指定年份和月份的
YearMonth对象。 - 调用
YearMonth.lengthOfMonth()方法,它会自动计算并返回该月的总天数,也就是最后一天是几号。
示例代码
import java.time.YearMonth;
public class LastDayOfMonth {
public static void main(String[] args) {
// 示例1:获取2025年2月的最后一天
int year = 2025;
int month = 2; // 月份从1开始 (1=January, 2=February, ...)
YearMonth yearMonth = YearMonth.of(year, month);
int lastDay = yearMonth.lengthOfMonth();
System.out.println(year + "年" + month + "月的最后一天是: " + lastDay + "号"); // 输出: 2025年2月的最后一天是: 28号
// 示例2:获取2025年2月的最后闰年2月的最后一天
year = 2025;
month = 2;
yearMonth = YearMonth.of(year, month);
lastDay = yearMonth.lengthOfMonth();
System.out.println(year + "年" + month + "月的最后一天是: " + lastDay + "号"); // 输出: 2025年2月的最后一天是: 29号
// 示例3:获取2025年9月的最后一天
year = 2025;
month = 9;
yearMonth = YearMonth.of(year, month);
lastDay = yearMonth.lengthOfMonth();
System.out.println(year + "年" + month + "月的最后一天是: " + lastDay + "号"); // 输出: 2025年9月的最后一天是: 30号
}
}
使用 java.time API 获取完整的 LocalDate 对象
如果你不仅想知道最后一天是几号,还想获得一个完整的日期对象(2025-02-28),可以使用 atEndOfMonth() 方法。
示例代码
import java.time.LocalDate;
import java.time.YearMonth;
public class LastDayOfMonthAsDate {
public static void main(String[] args) {
int year = 2025;
int month = 2;
// 1. 创建 YearMonth 对象
YearMonth yearMonth = YearMonth.of(year, month);
// 2. 使用 atEndOfMonth() 获取该月最后一天的 LocalDate
LocalDate lastDayOfMonth = yearMonth.atEndOfMonth();
System.out.println(year + "年" + month + "月的最后一天完整日期是: " + lastDayOfMonth); // 输出: 2025年2月的最后一天完整日期是: 2025-02-28
// 也可以直接从 LocalDate 获取
LocalDate someDateInMonth = LocalDate.of(2025, 9, 15);
LocalDate lastDay = someDateInMonth.withDayOfMonth(someDateInMonth.lengthOfMonth());
System.out.println(someDateInMonth + " 所在月的最后一天是: " + lastDay); // 输出: 2025-09-15 所在月的最后一天是: 2025-09-30
}
}
使用传统的 java.util.Calendar 类 (不推荐,但需了解)
在 Java 8 之前,Calendar 是处理日期和时间的主要工具,这种方法比较繁琐,容易出错,但在维护旧项目时可能会用到。
核心思路
- 获取一个
Calendar实例。 - 将年份和月份设置好。注意:
Calendar中的月份是从 0 开始的(0=January, 1=February, ..., 11=December)。 - 将日期设置为下个月的第 0 天,这是一个巧妙的技巧,因为“下个月的第 0 天”在逻辑上就等于“本月的最后一天”。
- 从
Calendar对象中获取日期(DAY_OF_MONTH)。
示例代码
import java.util.Calendar;
public class LastDayOfMonthCalendar {
public static void main(String[] args) {
int year = 2025;
int month = 2; // 注意:传入的月份是 2 (二月)
Calendar calendar = Calendar.getInstance();
// 设置年份和月份,注意:Calendar的月份是从0开始的,所以要减1
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month - 1);
// 关键步骤:将日期设置为下个月的第0天,这会自动回滚到当前月的最后一天
calendar.set(Calendar.DAY_OF_MONTH, 0);
int lastDay = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(year + "年" + month + "月的最后一天是: " + lastDay + "号"); // 输出: 2025年2月的最后一天是: 28号
}
}
总结与对比
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
java.time.YearMonth |
代码简洁、清晰、易读;线程安全;API 设计优秀,不易出错。 | 需要 Java 8 或更高版本。 | ⭐⭐⭐⭐⭐ (首选) |
java.time.LocalDate |
功能强大,可以直接得到完整的日期对象;同样是现代、线程安全的 API。 | 需要先创建一个中间日期对象,比 YearMonth 稍微多一步。 |
⭐⭐⭐⭐⭐ (首选) |
java.util.Calendar |
兼容旧版 Java (Java 8 之前)。 | API 繁琐、不易用;月份从 0 开始,容易混淆;Calendar 是可变的,不是线程安全的。 |
⭐☆☆☆☆ (仅用于维护旧代码) |
对于所有新项目,请务必使用 Java 8+ 的 java.time API,它更简单、更安全,也更符合现代编程习惯。YearMonth.of(year, month).lengthOfMonth() 是获取月份天数的最佳方式。


