推荐使用java 8的java.time包:localdatetime.now()获取本地日期时间,zoneddatetime.now()获取带时区时间,instant.now()获取绝对时间戳,datetimeformatter用于线程安全的格式化。

在 Java 中获取当前系统的本地日期和时间,推荐使用 Java 8 引入的 java.time 包,它比旧的 Date 和 Calendar 更简洁、线程安全且语义清晰。
获取本地日期时间(LocalDateTime)
LocalDateTime 表示不带时区的“本地区域日期时间”,适合仅需年月日时分秒的场景(如日志记录、业务时间戳等),但不反映具体时区含义:
- 调用
LocalDateTime.now()即可获取系统默认时区下的当前日期时间 - 它底层依赖系统默认时区(
ZoneId.systemDefault()),但自身不存储时区信息 - 示例:LocalDateTime now = LocalDateTime.now(); // 如 2024-06-15T14:32:18
获取带时区的当前时间(ZonedDateTime)
若需明确表达“此刻在哪个时区的时间”,应使用 ZonedDateTime,它包含时区信息,能正确处理夏令时、时区偏移变化等:
- 推荐写法:
ZonedDateTime.now()—— 使用系统默认时区 - 显式指定时区更稳妥:
ZonedDateTime.now(ZoneId.of("Asia/Shanghai")) - 可从中提取
LocalDateTime、Instant或格式化字符串
获取时间戳(Instant)用于跨时区统一表示
Instant 表示从 1970-01-01T00:00:00Z 开始的毫秒/纳秒数,是时区无关的绝对时间点,适合系统间通信、数据库存储或计算时间差:
- 直接调用
Instant.now() - 如需转为本地时间显示:用
instant.atZone(ZoneId.systemDefault()) - 与旧 API 互操作:
Date.from(instant)或instant.toEpochMilli()
格式化输出(DateTimeFormatter)
默认打印是 ISO 格式(如 2024-06-15T14:32:18.123)。自定义格式用 DateTimeFormatter:
- 预设格式:
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) - 中文格式支持:
DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss", Locale.CHINA) - 注意:
DateTimeFormatter是线程安全的,可复用为静态常量
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











