使用 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發佈於博客園

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章