Files
roll-room/doc/开发标准/时间.md
2026-04-23 16:58:11 +08:00

3.1 KiB
Raw Permalink Blame History

JDK与时间相关的包和API:

引入 描述
java.time 1.8+ 推荐使用
java.util 旧版 不推荐
java.text 旧版 日期字符串格式化相关,不推荐使用
java.sql 1.1 数据库相关,业务不推荐使用
java.time.chrono 1.8 可选,能不用就不用。支持非 ISO 历法系统

java.time包中的类

类/接口 用途
LocalDate 日期(年-月-日)
LocalTime 时间(时:分:秒.纳秒)
LocalDateTime 日期+时间
ZonedDateTime 带时区的日期时间
Instant 时间戳从1970-01-01的秒/毫秒)
Duration 时间间隔(基于秒和纳秒)
Period 日期间隔(基于年月日)
DateTimeFormatter 日期时间格式化
LocalDate,LocalTimeLocalDateTime都是指表示一个时间数字没有时区概念。比如LocalTime表示8:20并不能表示出具体的时间需要结合时区才能知道是哪里的8:20。

java.time.format DateTimeFormatter 及其相关类 用于格式化与解析日期时间 java.time.temporal 时间访问和调整的底层接口 包含 Temporal, TemporalField, TemporalUnit 等

java.time.zone 时区相关类 ZoneId, ZoneOffset, ZoneRules 等

java.util包中的类

说明
Date 传统日期类(已不推荐),不带时区
Calendar 日历计算(已不推荐),默认系统时区
TimeZone 时区信息

java.text包中的类

SimpleDateFormat - 旧版日期格式化(线程不安全)

java.sql

这些也都没有时区概念,只表示时间值

用途
Date SQL 日期
Time SQL 时间
Timestamp SQL 时间戳

最佳实践

关于时区:

  1. 系统内部应该只用java.time下的LocalDate,LocalTime,LocalDateTime这些不带时区的概念。
  2. 只有与外部交互时,才应该转成带时区的概念。 比如把前端请求的日期转成LocalDateTime返回给前端的时间应该转成前端对应时区的时间。或者请求外部依赖时需要传递时间应该确定好时区的概念。
  3. 定时任务的时间设置应该带上时区,否则将会按照系统所在时区执行,切换服务器时,时区会变,定时任务的执行时间也会变。 作为中国开发者,应该都用东八区时间。@Scheduled(cron = "2 15 0 * * ?", zone = "Asia/Shanghai")
  4. 服务器的时区都设置成东八区时间

查看时区:timedatectl 列出可支持的时区:timedatectl list-timezones | grep Shanghai 设置时区:sudo timedatectl set-timezone Asia/Shanghai

关于存储时间的格式:

  1. 系统中只允许使用LocalDateTime或者Long时间戳存储时间。优先用LocalDateTime既拥有时间戳的所有信息也有丰富的API操作时间。