localdate 是 java 8 引入的不可变、线程安全的纯日期类;用 now() 获取当前日期,推荐显式指定 zoneid;格式化需 datetimeformatter,内置 iso_local_date 或自定义 pattern,注意大小写敏感且避免 simpledateformat。

在 Java 中,LocalDate 是 java.time 包中用于表示“不带时分秒和时区”的日期的核心类。它不可变、线程安全,且设计简洁,非常适合处理纯日期逻辑。
获取当前系统日期
LocalDate 提供了静态方法 now(),可直接获取 JVM 当前时区下的日期(仅年月日):
说明:该方法依赖系统默认时区,但因为 LocalDate 本身不含时区信息,所以实际取的是该时区对应的“当天日期”。若需指定时区(如服务器在 UTC,但业务需按 Asia/Shanghai 计算),应使用带 ZoneId 的重载方法。
建议写法:
- 最常用(默认时区):
LocalDate today = LocalDate.now(); - 显式指定时区(更严谨):
LocalDate today = LocalDate.now(ZoneId.of("Asia/Shanghai"));
格式化输出日期
LocalDate 本身不提供 toString() 以外的格式化能力,需借助 DateTimeFormatter。Java 内置了若干预定义格式器,也支持自定义模式。
常见用法:
- 使用内置格式器(简洁):
String str = today.format(DateTimeFormatter.ISO_LOCAL_DATE); // 输出:2024-05-20 - 使用中文常用格式(自定义):
String str = today.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")); // 输出:2024年05月20日 - 注意:模式字母大小写敏感,
MM是月份,mm是分钟(对LocalDate无效,会抛异常)
完整示例代码
将获取与格式化结合,一行即可完成:
String formatted = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); // 如:2024-05-20
小提示:
- 避免用
SimpleDateFormat(老 API,非线程安全,已过时) - 如果只是打印调试,
LocalDate.now()默认调用toString(),输出形如2024-05-20,已符合 ISO 标准,无需额外格式化 - 如需转换为
java.util.Date或Calendar,应通过atStartOfDay()+ZoneId.systemDefault()转为ZonedDateTime,再转,但通常不推荐混用新旧时间 API
注意事项
关键细节:
-
LocalDate.now()返回的是调用时刻的日期,不是创建对象那一刻的“快照”——它本身不含时间信息,所以不会因后续时间推移而变化 - 格式器(
DateTimeFormatter)是线程安全的,可复用、可静态常量化,例如:private static final DateTimeFormatter CHN_FORMAT = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); - 若传入非法模式(如含
H、m等时间字段),运行时抛DateTimeException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











