推荐使用 java 8+ 的 java.time api 获取当天开始时间(00:00:00)和结束时间(23:59:59.999),以 localdate.now().atstartofday() 获取起始,用 localdate.now().plusdays(1).atstartofday().minusnanos(1) 获取精确结束时刻。

在 Java 中获取当天的开始时间和结束时间,推荐使用 Java 8+ 的 `java.time` API(如 `LocalDateTime`、`ZonedDateTime`),它线程安全、语义清晰、时区处理可靠。避免使用过时的 `Date` 和 `Calendar`。
获取当天的开始时间(00:00:00)
以系统默认时区为准,取当天的起始时刻:
- 用 `LocalDate.now()` 获取今天日期
- 调用 `.atStartOfDay()` 得到当天 00:00:00 的 `LocalDateTime`
- 如需带时区的 `ZonedDateTime`,可再调用 `.atZone(ZoneId.systemDefault())`
LocalDateTime startOfToday = LocalDate.now().atStartOfDay(); // 或带时区(推荐用于时间比较/数据库存储) ZonedDateTime startZoned = LocalDate.now().atStartOfDay(ZoneId.systemDefault());
获取当天的结束时间(23:59:59.999)
注意:严格意义上的“当天结束”是**下一秒的开始**,即 `tomorrow 00:00:00` 的前一瞬。更规范的做法是用“开区间”逻辑(如 `>= start &&
- 方法一(推荐):用 `LocalDateTime.of(...)` 拼出 `23:59:59.999`
- 方法二(更严谨):用 `LocalDate.now().plusDays(1).atStartOfDay().minusNanos(1)`,得到纳秒级精确的“最后一刻”
LocalDateTime endOfToday = LocalDate.now()
.plusDays(1)
.atStartOfDay()
.minusNanos(1); // 即 23:59:59.999999999
转换为其他类型(如 `Instant` 或 `Date`)
对接老系统或数据库时可能需要 `Instant` 或 `java.util.Date`:
- `ZonedDateTime.toInstant()` → 转为 UTC 时间戳(`Instant`)
- `Date.from(instant)` → 转为传统 `Date` 对象
- 注意:`LocalDateTime` 无时区,不能直接转 `Instant`,必须先指定时区
ZonedDateTime startZoned = LocalDate.now().atStartOfDay(ZoneId.systemDefault()); Instant startInstant = startZoned.toInstant(); // 推荐用于存储或传输 Date startDate = Date.from(startInstant);
注意事项
- 始终明确时区——`LocalDateTime` 不含时区信息,跨系统传值易出错;优先用 `ZonedDateTime` 或 `Instant`
- 数据库存取建议:用 `TIMESTAMP WITH TIME ZONE` 类型 + `Instant`,避免本地时区歧义
- 不要用 `new Date().setHours(0,0,0,0)` 等旧方式,线程不安全且易受系统时区影响
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











