使用 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发布于博客园

posted @ 2023-01-31 12:45  快乐的欧阳天美1114  阅读(335)  评论(0编辑  收藏  举报