留一点专注,给这篇手记。
Java 工程

Java 时间类型与数据库字段映射

从 LocalDate 到 ZonedDateTime:梳理 Java 8 时间类型的精度、用途与数据库字段的对应关系,附端口占用排查。

Java 工程手记第 1 / 3 篇
这篇文章的目录⌄
  1. 时间类型
  2. 1. java.time.LocalDate
  3. 2. java.time.LocalTime
  4. 3. java.time.LocalDateTime
  5. 4. java.time.Instant
  6. 5. java.time.ZonedDateTime
  7. 6. java.time.OffsetDateTime
  8. 7. java.time.Duration
  9. 8. java.time.Period
  10. 数据库字段类型与 Java 类型的对应关系
  11. 附:查看端口号是否被占用

学习 Java 时整理的常用知识点:时间类型怎么选、数据库字段怎么对应,以及开发中常用的端口排查命令。

时间类型

Java 8 引入的 java.time 包提供了一套不可变、线程安全的时间类型,按精度和用途区分。

1. java.time.LocalDate

  • 描述: LocalDate 表示不带时间的日期(年、月、日)。它是不可变的且线程安全的。
  • 精度: 天
  • 数据库关联: 与数据库中的 DATE 类型对应。
java.time.LocalDate localDate = java.time.LocalDate.now();

2. java.time.LocalTime

  • 描述: LocalTime 表示不带日期的时间(时、分、秒、纳秒)。它也是不可变的且线程安全的。
  • 精度: 纳秒级
  • 数据库关联: 与数据库中的 TIME 类型对应。
java.time.LocalTime localTime = java.time.LocalTime.now();

3. java.time.LocalDateTime

  • 描述: LocalDateTime 是 LocalDate 和 LocalTime 的组合,表示不带时区的日期和时间。它是不可变的且线程安全的。
  • 精度: 纳秒级
  • 数据库关联: 与数据库中的 TIMESTAMP 或 DATETIME 类型对应。
java.time.LocalDateTime localDateTime = java.time.LocalDateTime.now();

4. java.time.Instant

  • 描述: Instant 表示时间线上的一个瞬时点,通常用于记录事件的时间戳。它是以 UTC 时间为基准的。
  • 精度: 纳秒级
  • 数据库关联: 通常与数据库中的 TIMESTAMP 类型对应,但需要转换为 LocalDateTime 或 ZonedDateTime 进行存储。
java.time.Instant instant = java.time.Instant.now();

5. java.time.ZonedDateTime

  • 描述: ZonedDateTime 表示带时区的日期和时间。它是 LocalDateTime 和 ZoneId 的组合。
  • 精度: 纳秒级
  • 数据库关联: 通常与数据库中的 TIMESTAMP WITH TIME ZONE 类型对应。
java.time.ZonedDateTime zonedDateTime = java.time.ZonedDateTime.now();

6. java.time.OffsetDateTime

  • 描述: OffsetDateTime 表示带偏移量的日期和时间,通常用于表示与 UTC 时间的偏移。
  • 精度: 纳秒级
  • 数据库关联: 通常与数据库中的 TIMESTAMP WITH TIME ZONE 类型对应。
java.time.OffsetDateTime offsetDateTime = java.time.OffsetDateTime.now();

7. java.time.Duration

  • 描述: Duration 表示两个时间点之间的时间量,通常用于表示秒和纳秒的时间间隔。
  • 精度: 纳秒级
  • 数据库关联: 通常不直接映射到数据库字段,但可以存储为 BIGINT(表示秒或毫秒)。
java.time.Duration duration = java.time.Duration.ofSeconds(60);

8. java.time.Period

  • 描述: Period 表示两个日期之间的时间量,通常用于表示年、月、日的间隔。
  • 精度: 天
  • 数据库关联: 通常不直接映射到数据库字段,但可以存储为 VARCHAR 或 INT。
java.time.Period period = java.time.Period.ofDays(10);

数据库字段类型与 Java 类型的对应关系

数据库类型Java类型
DATELocalDate
TIMELocalTime
TIMESTAMPLocalDateTime
TIMESTAMP WITH TIME ZONEZonedDateTime, OffsetDateTime
DATETIMELocalDateTime, java.util.Date
BIGINT (存储时间戳)Instant, Long

附:查看端口号是否被占用

开发中经常遇到端口被占用的情况,可以用下面的命令排查:

  1. 打开 cmd 命令行。

  2. 输入以下命令:

    netstat -ano | findstr :8090
    • netstat -ano:显示所有活动的网络连接和监听端口,并显示进程 ID (PID)。
    • findstr :8090:过滤出包含 8090 端口的信息。
  3. 如果 8090 端口被占用,你会看到类似以下的输出:

    TCP    0.0.0.0:8090           0.0.0.0:0              LISTENING       1234
    TCP    [::]:8090              [::]:0                 LISTENING       1234
    • 其中 1234 是占用该端口的进程 ID (PID)。
    • 若没有被占用则什么都不显示。
  4. 如果你想查看是哪个程序占用了该端口,可以通过 PID 查找进程名称。运行以下命令:

    tasklist | findstr 1234
    • 将 1234 替换为实际的 PID。
    • 输出会显示占用该端口的进程名称。