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