推荐使用java.time包的yearmonth类获取指定月份的第一天和最后一天:yearmonth.of(year, month).atday(1)得第一天,atendofmonth()得最后一天;当前月则用yearmonth.now();支持扩展为localdatetime或instant。

在 Java 中获取指定月份的第一天和最后一天,推荐使用 java.time 包(Java 8+),它简洁、线程安全且不易出错。核心是用 YearMonth 类,它天然表示“某年某月”,能直接获取该月的起止日期。
用 YearMonth 获取当月或指定年月的第一天和最后一天
YearMonth 是最直接的工具。它支持构造指定年份和月份,然后调用 atDay(1) 得第一天,lengthOfMonth() 结合 atDay() 得最后一天。
- 获取 2024 年 3 月的第一天:
YearMonth.of(2024, 3).atDay(1)→2024-03-01 - 获取 2024 年 3 月的最后一天:
YearMonth.of(2024, 3).atEndOfMonth()→2024-03-31(更推荐,语义清晰)
获取当前月份的第一天和最后一天
如果目标是当前系统月份,可先用 LocalDate.now() 构建 YearMonth,再调用对应方法:
- 第一天:
YearMonth.now().atDay(1) - 最后一天:
YearMonth.now().atEndOfMonth()
注意:这两个结果都是 LocalDate 类型,可直接用于日期计算或格式化。
兼容旧代码?避免使用 Calendar
虽然 Calendar 也能实现(如设为 1 日、再 set DAY_OF_MONTH 为最大值),但易出错、API 笨重、非线程安全。除非维护遗留系统,否则不建议使用。例如手动算最后一天需考虑闰年、大小月,而 YearMonth.atEndOfMonth() 内部已自动处理所有边界情况。
扩展:获取月初/月末的 LocalDateTime 或 Instant
若需带时间的版本(比如“2024-03-01T00:00:00”或“2024-03-31T23:59:59.999”),可在 LocalDate 基础上叠加时间:
- 月初时刻:
YearMonth.of(2024, 3).atDay(1).atStartOfDay() - 月末时刻(当天最后一毫秒):
YearMonth.of(2024, 3).atEndOfMonth().atTime(23, 59, 59, 999_000_000)
如需 UTC 时间戳,再调用 .atZone(ZoneId.systemDefault()).toInstant() 即可。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











