LocalDate.now()获取系统默认时区当前日期,不可变且线程安全;支持加减、调整、比较、闰年判断;格式化用DateTimeFormatter,解析需注意异常;相比Date/Calendar更语义清晰、安全易用。

Java 中 LocalDate 获取和处理当前日期,核心是用 LocalDate.now() 获取,再通过其不可变、线程安全的 API 进行计算或格式化。
获取当前日期
LocalDate.now() 返回系统默认时区下的当前日期(不包含时间部分)。它基于 JVM 的默认 Clock,本质是调用 System.currentTimeMillis() 并截断时间信息。
- 最常用写法:
LocalDate today = LocalDate.now(); - 若需指定时区(更精确控制),可传入
Clock:LocalDate.now(Clock.system(ZoneId.of("Asia/Shanghai"))) - 注意:它不依赖系统时间设置中的“时间”,只取“日期”部分,所以即使系统时间是 23:59:59,
now()仍返回当天日期
常见日期计算操作
LocalDate 是不可变对象,所有计算都返回新实例,原对象不变。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 加减天数:
today.plusDays(7)、today.minusMonths(1) - 调整到特定日(如本月第一天):
today.with(TemporalAdjusters.firstDayOfMonth()) - 比较日期:
today.isBefore(otherDate)、today.equals(otherDate)、ChronoUnit.DAYS.between(start, end) - 判断是否为闰年:
today.isLeapYear()
格式化与解析字符串
默认 toString() 输出为 yyyy-MM-dd 格式。自定义格式需用 DateTimeFormatter。
立即学习“Java免费学习笔记(深入)”;
- 格式化输出:
today.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"))→ “2024年06月12日” - 解析字符串:
LocalDate.parse("2024-06-12")(默认格式)或LocalDate.parse("2024/06/12", DateTimeFormatter.ofPattern("yyyy/MM/dd")) - 解析失败会抛
DateTimeParseException,建议配合 try-catch 使用
与传统 Date/Calendar 的区别提醒
LocalDate 属于 Java 8 引入的 java.time 包,设计更清晰:
- 不包含时间、时区,专注“日历日期”语义
- 线程安全,无需同步或复制
- 无 setter 方法,杜绝意外修改
- 避免了
java.util.Date的年份从 1900 开始、月份从 0 开始等反直觉设计

















