首页 > 编程语言 >使用 java.time.LocalDateTime

使用 java.time.LocalDateTime

时间:2023-01-31 12:55:55浏览次数:62  
标签:info JsonFormat java time some LocalDateTime ben

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

标签:info,JsonFormat,java,time,some,LocalDateTime,ben
From: https://www.cnblogs.com/luo630/p/17077756.html

相关文章

  • javaSE知识学习目录
    Java环境配置(JDK的安装)Java入门程序 HelloWorld.java......
  • JavaScript学习笔记—DOM:属性节点
    属性也是一个节点对象(Attr),和文本一样,通常我们不会去直接获取节点对象,而是通过元素来完成对属性的操作:方式一:读取:元素.属性名(注意,class属性需要使用className来读取)读......
  • Java签名排序,实现php的ksort升序排序
    php这边是需要使用ksort排序生成签名平台要求通用签名生成步骤按照键字母进行正序排序(ASCII码从小到大排序【字典序】)#排序之后的参数按照key+value+key+val......
  • java为什么要使用静态内部类
    参考:https://blog.csdn.net/fengyuyeguirenenen/article/details/122696650static内部类意味着:(1)为创建一个static内部类的对象,我们不需要一个外部类对象。(2)不能从......
  • Java按自然语言字符截取字符串
    由于unicode字符在java中可能超过2个char,String类自带的substring不能很好的满足要求,可能产生?,所以按照commons的StringUtils开发了这个方法/***仿照{@link......
  • 关于IDEA运行时报内存溢出FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - Jav
    IDEA运行时,经常会碰到内存溢出问题:FATALERROR:CALL_AND_RETRY_LASTAllocationfailed-JavaScriptheapoutofmemory,非常讨厌,浪费时间,现记录解决方案如下:1、全......
  • JAVA常用类
    JAVA常用类String常用方法length()返回字符串的长度charAt()根据下标获取字符contains()判断当前字符串中是否包含子字符串toCharArray()将字符串转成数组in......
  • DevStyle,一个让Java开发更现代化的工具!
    如果您喜欢Eclipse的强大功能,但对它的可用性和美观度没有很高的要求,那么从今天开始,请准备好从全新的角度来看待Eclipse。在之前暗黑的插件基础上,MyEclipse官方团队为大家带......
  • java (11)方法的重写和super
    1、重写:在Java和其他一些高级面向对象的编程语言中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这......
  • Java(11)super 和 this
    一、this概念:this代表着当前对象的引用,this代表的是执行者,this本质是一个执行当前对象的指针 最常见的情况是是对象的属性因为与构造器参数同名而被构造器参数屏蔽时,......