淺談Mybatis+mysql 存儲(chǔ)Date類(lèi)型的坑
場(chǎng)景:
把一個(gè)時(shí)間字符串轉(zhuǎn)成Date,存進(jìn)Mysql。時(shí)間天數(shù)會(huì)比實(shí)際時(shí)間少1天,也可能是小時(shí)少了13-14小時(shí)
Mysql的時(shí)區(qū)是CST(使用語(yǔ)句:show VARIABLES LIKE '%time_zone%'; 查)
先放總結(jié):
修改方法:
1. 修改數(shù)據(jù)庫(kù)時(shí)區(qū)
2. 在jdbc.url里加后綴 &serverTimezone=GMT%2B8
3. 代碼里設(shè)置時(shí)區(qū),給SimpleDateFormat.setTimeZone(...)
例外:new Date() 可以直接存為正確時(shí)間,其他的不行。比如我試過(guò),把new Date用sdf轉(zhuǎn)個(gè)2次,然后就錯(cuò)誤了
貼一下測(cè)試的一下渣碼
// 1.new Date()直接存數(shù)據(jù)庫(kù)則是正確的日期 結(jié)果:√ 190626,數(shù)據(jù)庫(kù)存儲(chǔ)正常
// 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];// 會(huì)加上00:00:00
// Date date = yyMMddFormatter.parse(tempStrDate);
// 3.配置文件加上&serverTimezone=GMT%2B8,√ 正確
// 4. 設(shè)置中國(guó)標(biāo)準(zhǔn)時(shí)區(qū) UTC+8 結(jié)果:√
// SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
// 設(shè)置時(shí)區(qū): 中國(guó)標(biāo)準(zhǔn)時(shí) China Standard Time UTC+08:00 使用GMT+8東8區(qū),結(jié)果:?使用默認(rèn)時(shí)區(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. 測(cè)試毫秒數(shù) new Date(ms);但是要先使用sdf轉(zhuǎn)入?yún)?結(jié)果:× 問(wèn)題就在于SimpleDateFormat會(huì)混亂時(shí)區(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類(lèi)型的時(shí)間轉(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);
// 將對(duì)象里時(shí)間屬性設(shè)置為String,數(shù)據(jù)庫(kù)里仍然用Date,用數(shù)據(jù)庫(kù)的時(shí)間函數(shù)轉(zhuǎn)化
最后,還是采用的數(shù)據(jù)庫(kù)為timestamp類(lèi)型,用mysql的時(shí)間函數(shù)進(jìn)行轉(zhuǎn)換,保證時(shí)間為數(shù)據(jù)庫(kù)時(shí)間
補(bǔ)充知識(shí):mybatis解決java中的date類(lèi)型存入oracle數(shù)據(jù)庫(kù)之后不顯示時(shí)分秒
實(shí)體類(lèi)中類(lèi)型為java.util.Date
private Date update_date;
數(shù)據(jù)庫(kù)中對(duì)應(yīng)字段的類(lèi)型為Date
不顯示 時(shí)分秒 的情況:
Mapping文件中對(duì)應(yīng)字段的jdbcType為DATE類(lèi)型
如果顯示時(shí)分秒的話(huà),只需要將Mapping文件中對(duì)應(yīng)字段的類(lèi)型改為T(mén)IMESTAMP即可.
以上這篇淺談Mybatis+mysql 存儲(chǔ)Date類(lèi)型的坑就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SSM框架整合之Spring+SpringMVC+MyBatis實(shí)踐步驟
大家都知道Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架,本文主要介紹三大框架的整合包含spring和mybatis的配置文件,還有spring-mvc的配置文件的詳細(xì)介紹,通過(guò)項(xiàng)目實(shí)踐步驟給大家詳細(xì)介紹,感興趣的朋友一起看看吧2021-06-06
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(23)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-07-07
關(guān)于Java8中map()和flatMap()的一些事
這篇文章主要給大家介紹了關(guān)于Java8中map()和flatMap()的一些事,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
java GUI實(shí)現(xiàn)加法計(jì)算器
這篇文章主要為大家詳細(xì)介紹了java GUI實(shí)現(xiàn)加法計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
Java多線(xiàn)程中的ThreadPoolExecutor解讀
這篇文章主要介紹了Java多線(xiàn)程中的ThreadPoolExecutor解讀,線(xiàn)程池中的核心線(xiàn)程數(shù),當(dāng)提交一個(gè)任務(wù)時(shí),線(xiàn)程池創(chuàng)建一個(gè)新線(xiàn)程執(zhí)行任務(wù),直到當(dāng)前線(xiàn)程數(shù)等于corePoolSize;如果當(dāng)前線(xiàn)程數(shù)為corePoolSize,繼續(xù)提交的任務(wù)被保存到阻塞隊(duì)列中,等待被執(zhí)行,需要的朋友可以參考下2023-09-09

