做單元測試的時候發現新增數據的時間不對,由於使用的jpa保存的數據,實體類的時間爲LocalDateTime, 數據庫字段爲DateTime
實體的時間爲:15:50,可是存到數據庫後就變成了1:50,很是詫異
接下來就想辦法怎麼解決吧。。。。
一共想到倆種方式,要麼是mysql的時區有問題,要麼jpa有問題
一 jpa的問題
由於低版本JPA(2.3之前)中還未使用jdk1.8的新特性,會把LocalDate和LocalDateTime映射成 BLOB類型,而不是 DATE或 TIMESTAMP。
大家知道,在實體Entity裏面,可以使用java.sql.Date、java.sql.Timestamp、java.util.Date來映射到數據庫的date、timestamp、datetime等字段
但是,java.sql.Date、java.sql.Timestamp、java.util.Date這些類都不好用,很多方法都過時了。
Java8裏面新出來了一些API,LocalDate、LocalTime、LocalDateTime 非常好用
爲什麼JPA不支持LocalDate 和LocalDateTime?
因爲JPA2.1版本在java8之前發佈,因此@Temporal註解只能用在java.util.Date和java.util.Calendar屬性上。
看到jpa解析出來的類型是時間戳,那就放心了不是jpa的版本引起的
那要是版本引起的除了升級還有啥法子可以解決呢?
使用AttributeConverter自定義參數解析
//轉換LocalDate
@Converter(autoApply = true)
public class LocalDateAttributeConverter implements AttributeConverter<LocalDate, Date> {
@Override
public Date convertToDatabaseColumn(LocalDate locDate) {
return (locDate == null ? null : Date.valueOf(locDate));
}
@Override
public LocalDate convertToEntityAttribute(Date sqlDate) {
return (sqlDate == null ? null : sqlDate.toLocalDate());
}
}
//轉換LocalDateTime
@Converter(autoApply = true)
public class LocalDateTimeAttributeConverter implements AttributeConverter<LocalDateTime, Timestamp> {
@Override
public Timestamp convertToDatabaseColumn(LocalDateTime locDateTime) {
return (locDateTime == null ? null : Timestamp.valueOf(locDateTime));
}
@Override
public LocalDateTime convertToEntityAttribute(Timestamp sqlTimestamp) {
return (sqlTimestamp == null ? null : sqlTimestamp.toLocalDateTime());
}
}
然後在對應的實體類需要轉換的字段上加上註解既可
@Column
@Convert(converter = LocalDateTimeAttributeConverter.class)
private LocalDateTime endTime;
二 查看&修改mysql時區
查看 設置mysql時區
查看時區
show variables like ‘%time_zone%’;
system_time_zone | CST |
---|---|
time_zone | SYSTEM |
設置全局
set global time_zone=’+8:00’;
設置當前會話
set time_zone=’+8:00’;
立即生效
flush privileges;
查看操作系統時區
UTC是協調世界時(Universal Time Coordinated)
GMT(Greenwich Mean Time)是格林尼治平時
而CST卻同時可以代表如下 4 個不同的時區:
美國中部時間:Central Standard Time (USA) UT-6:00
澳大利亞中部時間:Central Standard Time (Australia) UT+9:30
中國標準時間:China Standard Time UT+8:00
古巴標準時間:Cuba Standard Time UT-4:00
感謝以下幾位大佬的分享
參考:
https://blog.csdn.net/mn960mn/article/details/53141366
https://blog.csdn.net/lmy86263/article/details/52650721?locationNum=11
https://www.cnblogs.com/blog-ice/p/10243963.html