<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
今天來聊一個簡單的話題,這是一個小夥伴在微信上問我的,對於初學者我非常能理解這類問題帶來的困擾,各種嘗試,各種搜尋,別人說的頭頭是道,但是就是解決不了自己的問題,今天我簡單從兩個方面來和大家聊聊這個問題,如果小夥伴們有其他的解決思路,也可以留言一起分享。
這個問題我們可以從兩方面來分析:
MySQL 本身問題,這個其實很好驗證,不就是時間麼,我們執行如下 SQL 看看 MySQL 上的時間跟我的電腦時間是否是一致的:
select now();
可以看到,MySQL 的這個時間跟我係統的時間其實就差了 8 小時,MySQL 本身的時間都不對,那你將來插入/查詢的時間肯定也不對。
這個查詢大家注意,要麼使用命令列操作,要麼使用 Sqlyog、Navicat 或者 Sequel Pro 之類的資料庫工具來操作,切勿使用 JDBC 來查詢,具體原因一會看完第二小節就明白了。
出現這個問題,多半是 MySQL 的時區不太對,我們重新給其設定一下時區即可。
首先我們通過如下指令來檢視一下 MySQL 當前的時區:
show variables like '%time_zone%';
可以看到,MySQL 說它的時區是 SYSTEM,那 SYSTEM 又是啥呢?第一條說了 SYSTEM 是 UTC(協調世界時,又稱世界標準時間或世界協調時間)。而我們的北京時間比 UTC 快了 8 小時,即 UTC+8。
所以我們現在要把 MySQL 的時區先給改對,可以通過修改組態檔來實現(/etc/mysql/mysql.conf.d/mysqld.cnf
),如下:
修改完成後,重啟 MySQL,再來檢視 MySQL 的時區:
可以看到,此時的 MySQL 時區就正常了。
那麼此時再執行 select now();
也就不會有問題了:
有的小夥伴可能嫌修改組態檔太麻煩了,那麼也可以通過 SQL 來修改時區:
set global time_zone = Asia/Shanghai
注意我們所在的時區是 Asia/Shanghai,小夥伴們不要自由發揮寫其他城市。
首先我們要確認 MySQL 沒問題。
當確認了 MySQL 沒有問題後,如果你的 MySQL 時間還是不對,那麼就有可能是 JDBC 連線的問題了。
這裡我用大家常見的 JdbcTemplate 來舉個例子,其他的資料庫框架操作也都是一樣的,我這裡主要是演示時區問題,資料操作細節問題就不再展示了。
首先我們來準備一個表,如下:
CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT, `createTime` datetime DEFAULT NULL, `updateTime` timestamp NULL DEFAULT NULL, `username` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
很簡單的幾個欄位,createTime 是 datetime 型別,updateTime 是 Timestamp 型別。
然後向表中新增一條記錄:
並且這個資料庫的時區是 Asia/Shanghai
接下來我們建立一個 Spring Boot 專案,引入 Web、JDBC API 依賴和 MySQL 驅動,如下:
然後我們來設定一下 MySQL 的連線資訊,如下:
spring.datasource.username=root spring.datasource.password=123 spring.datasource.url=jdbc:mysql:///test01?serverTimezone=UTC
小夥伴們看一下,在資料庫連線地址中,我特意設定了時區為 UTC,這個時區比我們目前的時區慢了 8 小時,我們來看看用這樣一個錯誤的時區,操作的結果是什麼樣子的。
@Autowired JdbcTemplate jdbcTemplate; @Test void contextLoads() { List<User> list = jdbcTemplate.query("select * from user", new BeanPropertyRowMapper<>(User.class)); System.out.println("list = " + list); }
大家看到,這個查詢結果查到的時間是 21 點,跟 13 點相比快了 8 小時。
為啥呢?
因為我們連線地址中加了 serverTimezone=UTC
引數,這個時候,系統會把從資料庫查詢到的資料當成是 UTC 時區的,即把 13 點當成 UTC 時區的,但是我自己當前裝置又是 Asia/Shanghai
時區,UTC 時區的 13 點轉成 Asia/Shanghai
時區之後就是 21 點了。
相同道理,大家也可以自行嘗試設定 serverTimezone=Asia/Tokyo
,時區設定為東京,東京比我們早一個小時,東京的 13 點就是我們的 12 點,那麼最終查詢結果就是 12 點。
從這個案例中我們可以看到,jdbc 連線引數中的時區優先順序高於 MySQL 伺服器的時區引數,所以這個連線引數大家也要尤其注意。
有的小夥伴遇到的時區問題則是另外一種,返回 JSON 的時候時間不對。
如果在專案中用了 jackson,並且使用 @JsonFormat
註解來格式化日期,就有可能出現時區問題,如下:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "Asia/Shanghai")
大家看到,這段程式碼如果沒有設定 timezone 屬性,那麼預設的時區就是 UTC,也會導致最終的時間差了 8 小時。
到此這篇關於MySQL總是差八個小時該如何解決的文章就介紹到這了,更多相關MySQL差八個小時內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45