淺談Mybatis+mysql 存儲Date類型的坑
場景:
把一個時間字符串轉(zhuǎn)成Date,存進(jìn)Mysql。時間天數(shù)會比實際時間少1天,也可能是小時少了13-14小時
Mysql的時區(qū)是CST(使用語句:show VARIABLES LIKE '%time_zone%'; 查)
先放總結(jié):
修改方法:
1. 修改數(shù)據(jù)庫時區(qū)
2. 在jdbc.url里加后綴 &serverTimezone=GMT%2B8
3. 代碼里設(shè)置時區(qū),給SimpleDateFormat.setTimeZone(...)
例外:new Date() 可以直接存為正確時間,其他的不行。比如我試過,把new Date用sdf轉(zhuǎn)個2次,然后就錯誤了
貼一下測試的一下渣碼
// 1.new Date()直接存數(shù)據(jù)庫則是正確的日期 結(jié)果:√ 190626,數(shù)據(jù)庫存儲正常
// Date now = new Date();
// 2,new Date()用simpleDateFormat轉(zhuǎn)化為字符串再轉(zhuǎn)為Date。結(jié)果: × 少1天 190625
// Date now1 = new Date();
// String tempStr = yyMMddFormatter.format(now1);
// String tempStrDate = tempStr.split(" ")[0];// 會加上00:00:00
// Date date = yyMMddFormatter.parse(tempStrDate);
// 3.配置文件加上&serverTimezone=GMT%2B8,√ 正確
// 4. 設(shè)置中國標(biāo)準(zhǔn)時區(qū) UTC+8 結(jié)果:√
// SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
// 設(shè)置時區(qū): 中國標(biāo)準(zhǔn)時 China Standard Time UTC+08:00 使用GMT+8東8區(qū),結(jié)果:?使用默認(rèn)時區(qū)setTimeZone(TimeZone.getDefault);
// sdf.setTimeZone(TimeZone.getTimeZone("UTC+8"));
// System.out.println(sdf.getTimeZone().toString());
// Date date = sdf.parse(liftMaxDt);
// System.out.println(sdf.getTimeZone().toString());
// System.out.println(date);
//
// Date targetDate = new Date(date.getTime());
// System.out.println("------------------");
// System.out.println(targetDate);
// 5. 測試毫秒數(shù) new Date(ms);但是要先使用sdf轉(zhuǎn)入?yún)?結(jié)果:× 問題就在于SimpleDateFormat會混亂時區(qū)
// SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
// Date date = sdf.parse(liftMaxDt);
// Date targetDate = new Date(date.getTime());
// System.out.println("使用sdf轉(zhuǎn)換date,在new Date(date.getTime())-----------");
// System.out.println(targetDate);
// 使用LocalDate.結(jié)果: × 還是少一天
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyMMdd");
LocalDate ldt = LocalDate.parse(liftMaxDt, df);
System.out.println("String類型的時間轉(zhuǎn)成LocalDateTime:"+ldt);
// LocalDate轉(zhuǎn)LocalDateTime
LocalDateTime lll = LocalDateTime.of(ldt, LocalTime.of(0,0,0));
ZoneId zone = ZoneId.systemDefault();
Instant instant = lll.atZone(zone).toInstant();
Date targetDate = Date.from(instant);
// 將對象里時間屬性設(shè)置為String,數(shù)據(jù)庫里仍然用Date,用數(shù)據(jù)庫的時間函數(shù)轉(zhuǎn)化
最后,還是采用的數(shù)據(jù)庫為timestamp類型,用mysql的時間函數(shù)進(jìn)行轉(zhuǎn)換,保證時間為數(shù)據(jù)庫時間
補(bǔ)充知識:mybatis解決java中的date類型存入oracle數(shù)據(jù)庫之后不顯示時分秒
實體類中類型為java.util.Date
private Date update_date;
數(shù)據(jù)庫中對應(yīng)字段的類型為Date
不顯示 時分秒 的情況:
Mapping文件中對應(yīng)字段的jdbcType為DATE類型
如果顯示時分秒的話,只需要將Mapping文件中對應(yīng)字段的類型改為TIMESTAMP即可.
以上這篇淺談Mybatis+mysql 存儲Date類型的坑就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用mybatis的interceptor修改執(zhí)行sql以及傳入?yún)?shù)方式
這篇文章主要介紹了使用mybatis的interceptor修改執(zhí)行sql以及傳入?yún)?shù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
最新hadoop安裝教程及hadoop的命令使用(親測可用)
這篇文章主要介紹了最新hadoop安裝教程(親測可用),本文主要講解了如何安裝hadoop、使用hadoop的命令及遇到的問題解決,需要的朋友可以參考下2022-06-06

