杰瑞科技汇

Java如何获取某月的最后一天?

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

Java如何获取某月的最后一天?-图1
(图片来源网络,侵删)

使用 Java 8+ 的 java.time API (推荐)

这是目前最推荐、最简洁、最安全的方法。java.time API 是 Java 8 引入的,专门用于处理日期和时间,它解决了旧 DateCalendar 类的许多设计缺陷。

核心思路

  1. 创建一个指定年份和月份的 YearMonth 对象。
  2. 调用 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 是处理日期和时间的主要工具,这种方法比较繁琐,容易出错,但在维护旧项目时可能会用到。

核心思路

  1. 获取一个 Calendar 实例。
  2. 将年份和月份设置好。注意Calendar 中的月份是从 0 开始的(0=January, 1=February, ..., 11=December)。
  3. 将日期设置为下个月的第 0 天,这是一个巧妙的技巧,因为“下个月的第 0 天”在逻辑上就等于“本月的最后一天”。
  4. 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() 是获取月份天数的最佳方式。

Java如何获取某月的最后一天?-图2
(图片来源网络,侵删)
Java如何获取某月的最后一天?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇