溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么解決從Mysql數據庫獲取timestamp比正常時間早8小時問題

發布時間:2021-12-04 11:42:24 來源:億速云 閱讀:384 作者:iii 欄目:云計算

本篇內容介紹了“怎么解決從Mysql數據庫獲取timestamp比正常時間早8小時問題”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

問題是:使用同一Mysql數據庫,獲取相同時間數據,window下返回頁面是正常時間,但在linux下卻早了8小時。

服務器環境:centos8,mysql8.0.21

一、首先排查服務器時區設置及系統時鐘和硬件時鐘的同步:

(一)date 查看/設置系統時間

1、將日期設置為2020年11月6日
[root@centos7 ~]# date -s 11/06/20
2、將時間設置為11點12分13秒
[root@centos7 ~]# date -s 11:12:13
3、將時間設置為2020年11月6日11點12分13秒(MMDDhhmmYYYY.ss)
[root@centos7 ~]# date 1106111220.13

(二)hwclock/clock 查看/設置硬件時間

1、查看系統硬件時鐘(以下兩個一樣效果)
[root@centos7 ~]# hwclock  --show
[root@centos7 ~]# clock  --show
2、設置硬件時間(以下兩個一樣效果)
[root@centos7 ~]# hwclock --set --date="11/06/20 12:13" (月/日/年時:分:秒)
[root@centos7 ~]# clock --set --date="11/06/20 12:13" (月/日/年時:分:秒)

(三)同步系統及硬件時鐘

1、系統時間找硬件時間同步(以下兩個一樣效果)
[root@centos7 ~]# hwclock --hctosys
[root@centos7 ~]# clock --hctosys  
備注:hc代表硬件時間,sys代表系統時間,以硬件時間為基準,系統時間找硬件時間同步
2、硬件時間找系統時間同步(以下兩個一樣效果)
[root@centos7 ~]# hwclock --systohc
[root@centos7 ~]# clock --systohc 
備注:以系統時間為基準,硬件時間找系統時間同步

(四)修改時區

#CentOS和Ubuntu的時區文件是/etc/localtime,但是在CentOS7以后localtime以及變成了一個鏈接文件
[root@centos7 ~]# ll /etc/localtime 
lrwxrwxrwx 1 root root 33 Nov 15  2020 /etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai

# 如果錯誤,需要修改,有多種方法:
[root@centos7 ~]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 最好的方法是使用timedatectl命令
[root@centos7 ~]# timedatectl list-timezones |grep Shanghai    #查找中國時區的完整名稱
[root@centos7 ~]# timedatectl set-timezone Asia/Shanghai    #其他時區以此類推
# 或者直接手動創建軟鏈接
[root@centos7 ~]# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

二、如果確定服務器存在問題,卻又因系統地域等原因無法修改,也可以設置mysql的時區:

>select now();
+---------------------+
| now()               |
+---------------------+
| 2020-11-23 12:30:06 |
+---------------------+
1 row in set (0.00 sec)
> show variables like "%time_zone%";
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | EST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)

time_zone說明mysql使用system的時區
system_time_zone說明system使用EST時區 ( PS:EST美國時區,CST世界標準世界)

#臨時修改,在mysql中執行
>set global time_zone = '+8:00'; ##修改mysql全局時區為北京時間,即我們所在的東8區
>set time_zone = '+8:00'; ##修改當前會話時區
>flush privileges; #立即生效

#永久修改,退出mysql執行
[root@centos7 ~]# vim /etc/my.cnf ##在[mysqld]區域中加上
[root@centos7 ~]# default-time_zone = '+8:00'
[root@centos7 ~]# /etc/init.d/mysqld restart ##重啟mysql使新時區生效

三、如果確定服務器存在問題,卻又因客觀因素無法修改服務器和數據庫,也可以在數據庫請求URL上修改:

application.yml配置:(系統數據庫參數配置文件,GMT%2B8這個參數轉義后GMT+8表示設置數據庫時間為東八區(北京)時間,如果設置GMT,可以在Spring.jackson.time-zone中設置GMT+8,設置一處就可以)

datasource:
    url: jdbc:mysql://localhost:3306/test-db?useUnicode=true&characterEncoding=UTF-8&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8

spring:
    jackson:
        date-format: yyyy-MM-dd HH:mm:ss
        time-zone: GMT+8

四、也有腦洞更大的配置,每處取值都要做注釋很容易疏漏:

# 在實體類Po類的Date上設置,來接收數據庫中的時間字段:

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")

進行一波改動后,回歸正題:Docker容器時間與主機時間不一致的問題,又是Docker在搗鬼!

# 主機時間
[root@centos8]# date
Mon Nov 23 13:43:52 CST 2020

# 容器時間
[root@centos8]# docker exec e8573a89fb94 date
Mon Nov 23 05:44:39 UTC 2020

CST應該是指(China Shanghai Time,東八區時間)
UTC應該是指(Coordinated Universal Time,標準時間)

所以,這2個時間實際上應該相差8個小時。(PS:所以沒有設置過的容器, 一般跟宿主機時間相差8h),必須統一兩者的時區。

# 共享主機的localtime  (方法一)
# 創建容器的時候指定啟動參數,掛載localtime文件到容器內,保證兩者所采用的時區是一致的。
[root@centos8]# docker run --name <name> -v /etc/localtime:/etc/localtime:ro 


# 復制主機的localtime  (方法二)
[root@centos8]# docker cp /etc/localtime [containerId]:/etc/localtime


# 創建自定義的dockerfile  (方法三)
[root@centos8]# RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone \

“怎么解決從Mysql數據庫獲取timestamp比正常時間早8小時問題”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女