使用 java.time.LocalDateTime
Java 8
PostgreSQL 14
spring-boot-starter-parent 2.7.3
mybatis-plus-boot-starter 3.4.3.4
--
0、序章
和 数据库的时间类型匹配 时,一直使用的是 java.util.Date,也未发生什么错误情况。
据说使用 Java 8 新增的 java.time.LocalDateTime 也可以匹配。ben发布于博客园
本文演示两者使用的异同。
准备工作
建立数据表:some_info
创建表some_info
-- Table: schema2023.some_info
-- DROP TABLE schema2023.some_info;
CREATE TABLE IF NOT EXISTS schema2023.some_info
(
id character varying(128) COLLATE pg_catalog."default" NOT NULL,
name character varying(100) COLLATE pg_catalog."default" NOT NULL,
money double precision,
days integer,
create_time timestamp without time zone NOT NULL,
CONSTRAINT some_info_pkey PRIMARY KEY (id)
)
TABLESPACE pg_default;
ALTER TABLE schema2023.some_info
OWNER to postgres;
COMMENT ON TABLE schema2023.some_info
IS '一些信息';
COMMENT ON COLUMN schema2023.some_info.id
IS '主键';
COMMENT ON COLUMN schema2023.some_info.name
IS '名称';
COMMENT ON COLUMN schema2023.some_info.money
IS '价值:人民币计价';
COMMENT ON COLUMN schema2023.some_info.days
IS '有效天数';
COMMENT ON COLUMN schema2023.some_info.create_time
IS '创建时间';
其中,create_time 字段的类型为 timestamp without time zone。
在测试项目 bootweb 中建立 实体类等文件:基于mybatis-plus。ben发布于博客园
其中,实体类从 createTime 字段如下:使用 Date 还是 LocalDateTime 可在 后面试验中切换。
提供接口:
添加 /api/someInfo/add
获取 /api/someInfo/get
ben发布于博客园
1、使用 java.util.Date
默认情况,不使用 @JsonFormat
添加:
pgAdmin 4 中显示为:
ben发布于博客园
获取:
获取的 createTime 为 "2023-01-31T01:29:47.410+00:00" ,是 0时区的时间。 前端开发解析该 格式 的 难度较大吧。
ben发布于博客园
使用 @JsonFormat 修改 creatTime(1):本地时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS", timezone = "GMT+8")
添加:
获取:
修改成功:时间已变更为 GMT+8 的本地时间。
ben发布于博客园
使用 @JsonFormat 修改 creatTime(2):时间戳
@JsonFormat(shape = JsonFormat.Shape.NUMBER)
添加:
获取:
修改成功。
此时,前端使用 该 时间戳 可以直接转换为 前端的本地时间:
Chrome 的控制台中测试
2、使用 java.time.LocalDateTime
将实体类的 createTime 的类型改为 java.time.LocalDateTime 进行测试。
注意,同时修改相关文件。
po.setCreateTime(LocalDateTime.now());
默认情况,不使用 @JsonFormat
添加:
获取:
小结:ben发布于博客园
和 使用 java.util.Date 不同,这里的 createTime 为 本地时间——"2023-01-31T10:00:07.303"。
使用 @JsonFormat 修改 creatTime(1):本地时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS", timezone = "GMT+8")
添加:
修改:
{
"id": "302099f2-ecfe-43f9-846a-36f5ee5b4442",
"name": "LocalDateTime2",
"money": 678.678,
"days": 67887,
"createTime": "2023-01-31 10:05:18.708"
}
小结:
和 使用 java.util.Date 相同。
ben发布于博客园
使用 @JsonFormat 修改 creatTime(2):时间戳
@JsonFormat(shape = JsonFormat.Shape.NUMBER)
添加:
修改:
{
"id": "227602b4-e634-4a57-b16e-1b9d21fc3d51",
"name": "LocalDateTime3",
"money": 5678.5678,
"days": 567887,
"createTime": [
2023,
1,
31,
10,
9,
1,
149000000
]
}
失败!ben发布于博客园
createTime 不是时间戳,而是一个 数组!这样的话,前端解析有难度吧!
要怎么处理呢?
见 参考文档#2 的解法(下一节):全局修改。
3、总结
使用 java.util.Date、java.time.LocalDateTime 返回的 createTime 的异同:
不同情况 | java.util.Date | java.time.LocalDateTime |
默认 |
2023-01-31T01:29:47.410+00:00 0时区时间 前端解析难道较大 |
2023-01-31T10:00:07.303 本地时间 |
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS", timezone = "GMT+8") |
2023-01-31 10:05:18.708 本地时间 |
2023-01-31 10:05:18.708 本地时间 |
@JsonFormat(shape = JsonFormat.Shape.NUMBER) |
1675132003606 正确 |
[
2023,
1,
31,
10,
9,
1,
149000000
]
整数数组:不符合预期。
还需继续解决:全局方案,需要协同前后端。
|
---END---
本文链接:
https://www.cnblogs.com/luo630/p/17077756.html
ben发布于博客园
参考资料
1、Java 8 日期时间 API
https://www.runoob.com/java/java8-datetime-api.html
2、SpringBoot中对于LocalDate和LocalDateTime如何返回时间戳
https://www.jianshu.com/p/21309e1a08be
2020.11.03 15:18:18
原文:http://tech.cnhnb.com/post/9
3、
ben发布于博客园