String转java.sql.date转json以及java.sql.date传入mysql数据库少一天的问题

String转java.sql.date转json以及java.sql.date传入mysql数据库莫名少一天的问题

问题的产生:

数据库存入"yyyy-MM-dd"格式的date数据,要通过java.sql.date获取并转换成json返回到前端页面。而前端交互时传回的date是String格式,需要转换为java.sql.date并传入数据库。
就这样,产生了三大问题。一是"yyyy-MM-dd"格式的java.sql.date转为json默认变为了一个大整数(即时间戳)。二是String不能直接转换为java.sql.date。三是java.sql.date传入mysql数据库莫名少一天,比如2021-1-7会变为2021-1-6。

问题解决方案:

java.sql.date转json,这里我用的是jackson和Springboot

方式一:注解解决
在实体类关于java.sql.date的字段上添加注解@JsonFormat即可

import com.fasterxml.jackson.annotation.JsonFormat;

import java.sql.Date;

public class Province {
    private Integer id;
    private String nameProvince;
    private Integer numPatient;
    private Integer numCure;
    private Integer numDeath;

    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date timeCurrent;
}

方式二:配置文件解决
1、yml文件

spring:
  jackson:
    date-format: yyyy-MM-dd
    default-property-inclusion: always

2、properties文件

spring.jackson.date-format = yyyy-MM-dd
spring.jackson.default-property-inclusion=ALWAYS
String转java.sql.date

String类型转换成java.sql.Date类型不能直接进行转换,首先要将String转换成java.util.Date,在转化成java.sql.Date

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        java.util.Date utilDate = null;
        try {
            utilDate = format.parse(timeCurrent); //timeCurrent是前端返回的String格式的时间
        } catch (Exception e) {
            e.printStackTrace();
        }
        java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
java.sql.date传入mysql数据库莫名少一天的问题

碰到这个问题,我也觉得是时区的问题。在我的项目工程中,SpringBoot主配置文件中指明了MySQL所用的时区:serverTimezone=GMT%2B8

spring.datasource.url=jdbc:mysql://localhost:3306/springboot_db?serverTimezone=GMT%2B8&characterEncoding=utf-8

通过单元测试,我发现date减少一天是在date传入数据库返回新的json数据时造成的。
于是,抱着试一试的心态,结合java.sql.date转json的方案,我对实体类的代码稍作修改,使实体类中JsonFormat注解的时区与SpringBoot朱配置properties文件中的时区一致:

import com.fasterxml.jackson.annotation.JsonFormat;

import java.sql.Date;

public class Province {
    private Integer id;
    private String nameProvince;
    private Integer numPatient;
    private Integer numCure;
    private Integer numDeath;

    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT%2B8")
    private Date timeCurrent;
}

但是经过测试,这种方案不行,于是继续百度,找到了一种解决方案。原来是我的时区GMT%2B8本来就不行,要把它换为上海时区或者香港时区。
上海时区:Asia/Shanghai
香港时区:Hongkong
经过测试,两个地方用到的时区都要换才能解决问题,以改为上海时区为例:
1、实体类:

import com.fasterxml.jackson.annotation.JsonFormat;

import java.sql.Date;

public class Province {
    private Integer id;
    private String nameProvince;
    private Integer numPatient;
    private Integer numCure;
    private Integer numDeath;

    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "Asia/Shanghai")
    private Date timeCurrent;
}

2、SpringBoot主配置文件

spring.datasource.url=jdbc:mysql://localhost:3306/springboot_db?serverTimezone=Asia/Shanghai&characterEncoding=utf-8
综上,所有问题得到解决
特别鸣谢名篇参考博客

SpringBoot项目使用Jackson格式化JSON日期
https://blog.csdn.net/D_A_I_H_A_O/article/details/111406587

String 转化成java.sql.Date和java.sql.Time
https://blog.csdn.net/a347911/article/details/50401112

MySQL数据库存入Date时天数会少一天问题
https://blog.csdn.net/weixin_44977950/article/details/100689610

往数据库里插入时间数据时,时间自动减少了14h
https://blog.csdn.net/h996666/article/details/78782423?utm_source=blogxgwz3

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值