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