最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL時區(qū)差8小時的多種問題解決方法

 更新時間:2024年01月05日 11:29:29   作者:笑小楓  
mybatis將本地的數(shù)據(jù)傳入到mysql數(shù)據(jù)庫服務器的時候,服務器會對數(shù)據(jù)進行檢測,會把date類型的數(shù)據(jù)自動轉換為mysql服務器所對應的時區(qū),即0時區(qū),所以會相差8小時,本文給大家介紹了MySQL時區(qū)差8小時的問題解決方法,需要的朋友可以參考下

背景

最近在開發(fā)【Java面試 | 笑小楓】小程序,便發(fā)現(xiàn)老是有人半夜偷偷刷題,如下圖所示:

image-20230321205840646

現(xiàn)在都這么卷了嗎?大半夜的都不睡覺了嗎?還在擼題~越想越不對,趕緊看了一下,發(fā)現(xiàn)自己錄入題目的時間也好多都在凌晨。

好家伙,秒懂,時區(qū)錯了。錯就錯了吧,影響也不大。

直到現(xiàn)在出現(xiàn)了每日簽到的功能,好吧順手改一下,反正也不難。都改了,順手整理篇博客吧。

知識點

UTC:Coordinated Universal Time 協(xié)調世界時。

GMT:Greenwich Mean Time 格林尼治標準時間。(在協(xié)調世界時意義上的0時區(qū),即GMT = UTC+0)

中國的時間是【東八區(qū)】,比GMT多八個小時,即 GMT+8(或UTC+8,但習慣上還是用GMT+8)

代碼中常見的三種時間差錯問題

【我遇到的】本地獲取的時間沒有錯,存入數(shù)據(jù)庫的時候時間相差8小時

mybatis將本地的數(shù)據(jù)傳入到mysql數(shù)據(jù)庫服務器的時候,服務器會對數(shù)據(jù)進行檢測,會把date類型的數(shù)據(jù)自動轉換為mysql服務器所對應的時區(qū),即0時區(qū),所以會相差8小時。

解決方案:

  • 在數(shù)據(jù)庫鏈接上添加serverTimezone=GMT%2B8

image-20230321214129614

java下使用 new date()獲取的時間會和真實的本地時間相差8小時

new date()調用的是jvm時間,而jvm使用的時間默認是0時區(qū)的時間,即:和北京時間將會相差8小時。

解決方案:

  • 手動設置jvm時間:將時間改為第8時區(qū)的時間:
  • 如果是springboot項目,可以面向切面加上這個,或者啟動main類上加上如下代碼:
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));

數(shù)據(jù)庫時間沒有錯,獲取到了后端,之后返回給前端相差8小時

springboot中對加了@RestController或者@Controller+@ResponseBody注解的方法的返回值默認是Json格式,所以,對date類型的數(shù)據(jù),在返回瀏覽器端時,會被springboot默認的Jackson框架轉換,而Jackson框架默認的時區(qū)GMT(相對于中國是少了8小時)。所以最終返回到前端結果是相差8小時。

解決方案:

  • 將spring的json構造器的時區(qū)改正即可,在application.yml文件中添加:
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
  • 可以使用注解,在entity實體類的date數(shù)據(jù)上添加注解,那么數(shù)據(jù)庫傳回的data數(shù)據(jù)要轉換為json格式的時候就是北京時間了,再次傳回到前端的時候,也不會出現(xiàn)時區(qū)問題。
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date updateDate;

數(shù)據(jù)庫代碼時區(qū)的問題

以上說的都是代碼中時間的問題,還有一種情況,就是sql使用NOW()獲取時間,這種寫法太可惡了。強烈不推薦

這種情況使用的是數(shù)據(jù)庫的時間,首先我們看一下數(shù)據(jù)庫時間

select NOW();

image-20230321215559765

如果和當前時間一致,那么恭喜你,沒問題。

如果比當前時間少8小時,那么依舊恭喜你,你穿越了。

言歸正傳,如果比當前時間少8小時,該怎么處理呢?

通過Sql命令修改,臨時生效

本方法的優(yōu)點是,生效快,不需要重啟數(shù)據(jù)庫;缺點是重啟數(shù)據(jù)庫后配置失效。

首先檢查下Mysql系統(tǒng)時區(qū)

show variables like '%time_zone%';

image-20230321215721287

設置時區(qū)

-- 修改mysql全局時區(qū)為北京時間,即我們所在的東8區(qū)
set global time_zone = '+08:00'; 

-- 修改當前會話時區(qū),不然需要重新打開會話才會生效
set time_zone = '+08:00';

立即刷新生效

flush privileges;

然后再執(zhí)行一下我們的select NOW();查看一下時間,OK,時間一致

image-20230321220030720

通過配置文件來進行修改,永久性生效

本方法的優(yōu)點是永久性生效,缺點是需要重啟數(shù)據(jù)庫

修改mysql的配置文件。linux系統(tǒng)上是my.cnf文件,window系統(tǒng)是my.ini

在[mysqld]區(qū)域中加上 default-time_zone = ‘+8:00’

重啟mysql使新時區(qū)生效

總結

本文到這里就結束了??偨Y一下吧

代碼中常見的數(shù)據(jù)問題是,程序中正常,保存到數(shù)據(jù)庫中差8小時,這種情況用在數(shù)據(jù)庫連接中添加serverTimezone=GMT%2B8Java下使用 new date()獲取的時間會和真實的本地時間相差8小時,這個需要修改JVM時區(qū),正常很少見數(shù)據(jù)庫時間沒有錯,獲取到了后端,之后返回給前端相差8小時,可以通過設置json轉換的時區(qū)來進行調整修改數(shù)據(jù)庫的時區(qū),可以通過命令臨時修改和通過配置文件永久性修改

以上就是MySQL時區(qū)差8小時的問題解決方法的詳細內容,更多關于MySQL時區(qū)差8小時的資料請關注腳本之家其它相關文章!

相關文章

最新評論

阳信县| 克什克腾旗| 定州市| 防城港市| 蒙阴县| 高平市| 灌云县| 温泉县| 江门市| 绵竹市| 西充县| 昌黎县| 周宁县| 聂拉木县| 盐亭县| 云和县| 天台县| 托克逊县| 曲松县| 景德镇市| 区。| 泸定县| 垣曲县| 广东省| 夏邑县| 宣化县| 九台市| 漳浦县| 灌阳县| 宜兰市| 霞浦县| 雷波县| 莎车县| 平罗县| 昂仁县| 恩平市| 商水县| 常熟市| 嘉祥县| 荥阳市| 会东县|