【Mysql】探究Java Timestamp到 Mysql Timestamp发生的变化

本文探讨了Java中的Timestamp对象在转换至MySQL数据库时的行为变化。通过实例演示,揭示了Timestamp在不同时区下的存储及显示差异,尤其是在GMT+0时区与本地时区之间的转换过程。

Timestamp 是一个没有时区观念的时间戳,任何一个时区拿到这个时间戳都会转变为所在时区的时间。探究探究Java Timestamp到 Mysql Timestamp发生的变化。

  1. 不附带任何东西的Timestamp 存储数据库中发生的事件。
    在这里插入图片描述
    看上去没有任何区别 完全保持一致
  2. 使用sdf.setTimeZone(TimeZone.getTimeZone(“GMT+0”));强行进行转换
    当前服务器时间 北京时间(GMT+8)2018-11-07 14:45:19 1541573119000ms数据库存储时间 (本地数据库)            2018-11-07 06:45:19 1541573119000ms
    可以看到此时,经过方法的转换,时间戳发生了变化,数据库认为那是GMT+0时区的2018-11-07 14:45:19 所以把时间戳对应的整数向前推移了八个小时。

实验完毕,成功解答问题。

### MySQL 中 `DATETIME` 和 `TIMESTAMP` 字段对应的 Java 数据类型 在 MySQL 中,`DATETIME` 和 `TIMESTAMP` 是两种常用的日期时间数据类型。它们分别有各自的存储特性和范围,在将其映射到 Java 的数据类型时,通常会根据其功能和用途选择合适的类。 #### 1. **MySQL `DATETIME` 类型** - 在 MySQL 中,`DATETIME` 存储的是固定长度的日期时间值,占用 8 字节的空间。 - 它的取值范围是从 `1000-01-01 00:00:00` 到 `9999-12-31 23:59:59`[^1]。 - 对应于 Java 的标准库中,最常使用的数据类型是 `java.sql.Timestamp` 或者 `java.time.LocalDateTime`(自 JDK 8 起推荐使用的新 API)。 - 如果项目仍在使用旧版 JDBC,则可以采用 `java.sql.Timestamp` 来表示 `DATETIME` 值。 - 若使用较新的 JDK 版本并遵循现代编程实践,建议优先选用 `LocalDateTime` 表示不带时区的时间戳。 #### 2. **MySQL `TIMESTAMP` 类型** - `TIMESTAMP` 占用 4 字节空间,并且具有特定的时间范围限制,从 `1970-01-01 00:00:01 UTC` 至大约 `2038 年` 结束时刻 (UTC 时间)[^1]。 - 这种类型的实现依赖 Unix 时间戳机制,因此它总是相对于 UTC 计算。 - 映射至 Java 时,同样可以选择 `java.sql.Timestamp` 或更现代化的选择——`OffsetDateTime` 或 `Instant`。 - 使用 `java.sql.Timestamp` 可以兼容传统的数据库操作场景。 - 当需要处理带有明确时区偏移量的数据时,`OffsetDateTime` 更加适合;而如果仅需记录精确到秒级的世界协调时间 (`UTC`) ,则可考虑直接运用 `Instant`。 ```java // 示例代码展示如何将 MySQL DATETIME/TIMESTAMP 转换为相应的 Java 类型 import java.sql.Timestamp; import java.time.LocalDateTime; import java.time.Instant; public class MysqlToJavaTypes { public static void main(String[] args) { // 假设有一个来自数据库的结果集中的 Timestamp 实例 Timestamp mysqlTimestamp = new Timestamp(System.currentTimeMillis()); // 将 SQL Timestamp 转换成 LocalDateTime (适用于无时区需求的情况) LocalDateTime localDateTime = mysqlTimestamp.toLocalDateTime(); // 获取 Instant 表达当前瞬间(适配 TIMESTAMP 场景下的 UTC 时间管理) Instant instant = mysqlTimestamp.toInstant(); System.out.println("SQL Timestamp as LocalDateTime: " + localDateTime); System.out.println("SQL Timestamp as Instant: " + instant); } } ``` 上述代码片段展示了如何通过 JDBC 接收到来自 MySQL 数据表内的 `DATETIME` 或 `TIMESTAMP` 数据后转换成不同的 Java 时间对象形式的方法之一。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值