推荐使用java.time包获取当月首尾日:firstDay=today.withDayOfMonth(1),lastDay=today.with(TemporalAdjusters.lastDayOfMonth());可封装为工具方法,支持转字符串或LocalDateTime;旧版用Calendar需重置字段并避免共享实例。

在 Java 中获取当月第一天和最后一天,推荐使用 java.time 包(Java 8+),它比旧的 Date 和 Calendar 更简洁、线程安全且不易出错。
获取当月第一天
使用 LocalDate 的 withDayOfMonth(1) 方法,直接将当前日期设为当月第 1 天:
LocalDate today = LocalDate.now(); LocalDate firstDay = today.withDayOfMonth(1); // 如:2024-05-01
获取当月最后一天
推荐用 with(TemporalAdjusters.lastDayOfMonth()),它会自动处理不同月份天数(包括闰年二月):
LocalDate today = LocalDate.now(); LocalDate lastDay = today.with(TemporalAdjusters.lastDayOfMonth()); // 如:2024-05-31
需要先导入:import java.time.temporal.TemporalAdjusters;
封装成工具方法(可复用)
可以写一个简单静态方法,返回包含首尾日期的数组或自定义对象:
立即学习“Java免费学习笔记(深入)”;
- 返回数组:
LocalDate[] range = {firstDay, lastDay}; - 转为字符串(如用于 SQL 查询):
firstDay.toString()→"2024-05-01" - 若需带时间(如 00:00:00 / 23:59:59),可转为
LocalDateTime:firstDay.atStartOfDay()和lastDay.atTime(23, 59, 59)
兼容旧版本(Java 7 及以下)
若必须用 Calendar,注意重置字段并避免共享实例:
- 设为当月第一天:
cal.set(Calendar.DAY_OF_MONTH, 1); - 设为最后一天:
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); - 每次操作前建议调用
cal.setTime(new Date())重置时间,防止状态残留


















