Java 8 的 java.time API 推荐用于日期处理,LocalDate.now().withDayOfMonth(1) 获取当月第一天,LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()) 获取最后一天,支持任意年月、英文月份及时区扩展。

Java 8 引入的 java.time API 是处理日期时间的推荐方式,获取当月第一天和最后一天非常简洁直观,无需手动计算或依赖过时的 Date 和 Calendar。
使用 LocalDate 获取当月第一天和最后一天
LocalDate 是不可变、线程安全的日期类,适合纯日期操作(不含时间)。
- 获取当月第一天:
LocalDate.now().withDayOfMonth(1) - 获取当月最后一天:
LocalDate.now().withDayOfMonth(1).plusMonths(1).minusDays(1),或更推荐的写法:LocalDate.now().with(TemporalAdjusters.lastDayOfMonth())
示例代码:
LocalDate today = LocalDate.now();
LocalDate firstDay = today.withDayOfMonth(1);
LocalDate lastDay = today.with(TemporalAdjusters.lastDayOfMonth());
System.out.println("第一天: " + firstDay); // 2024-06-01
System.out.println("最后一天: " + lastDay); // 2024-06-30
带时分秒的 LocalDateTime 场景
如果需要带具体时间(如 00:00:00 或 23:59:59),可基于 LocalDate 构造 LocalDateTime:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 当月第一天 00:00:00:
firstDay.atStartOfDay() - 当月最后一天 23:59:59:
lastDay.atTime(23, 59, 59),或更精确地用lastDay.atTime(LocalTime.MAX)(即 23:59:59.999999999)
指定年月时的灵活用法
不局限于当前月份,也可对任意年月操作:
-
LocalDate.of(2023, 12, 15).withDayOfMonth(1)→ 2023-12-01 -
LocalDate.of(2023, 12, 15).with(TemporalAdjusters.lastDayOfMonth())→ 2023-12-31
支持英文月份名或 Month 枚举,例如 LocalDate.of(2024, Month.FEBRUARY, 10)。
注意事项与常见误区
- 避免用
Calendar手动设置 DAY_OF_MONTH=1 再调getActualMaximum()—— 冗长且易出错 -
TemporalAdjusters.lastDayOfMonth()自动适配大小月和闰年,比plusMonths(1).minusDays(1)更语义清晰、不易出错 - 若需时区信息(如“北京时间当月最后一天”),应使用
ZonedDateTime或先转为Instant,而非仅用LocalDate

















