服务docker化后,关于 时间 所踩的坑
问题描述:
项目中的时间和本地时间差了8个小时。这个问题太是常见了,对一个后端来说,这不能说是一个问题了,而是一个失误。但是,服务docker化后,我也被拦了一天,过程如下:
基操
一:设置linux时区
将时区设置为上海 centos 默认时区 UTC
# 查看
date
修改
timedatectl set-timezone Asia/Shanghai
二:查看库存储时间
我用的mysql,如果这里存储时间和系统时间都对不上,那先改这里吧
1:进入mysql 运行命令
# 查看数据库当前时间
SELECT NOW();
#查看时区
show variables like '%zone%';
select @@time_zone;
#修改mysql全局时区为北京时间
set global time_zone = '+8:00';
#修改当前会话时区
set time_zone = '+8:00';
#立即生效
flush privileges;
2:更改配置文件
编辑配置文件vim /etc/my.cnf,找到[mysqld],然后加入default-time-zone = '+8:00’
my.conf
[mysqld]
# set time-zone
default-time-zone = '+8:00'
# does not care about letter case
lower_case_table_names=1
三:jdbc连接更改
url: jdbc:mysql://localhost:3306/my-blog?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=CTT
重点 :serverTimezone=CTT or serverTimezone=Asia/Shanghai
四: application.yml文件添加
spring:
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
关于时区:
1:时区简介
地球是自西向东自转,东边比西边先看到太阳,东边的时间也比西边的早。东边时刻与西边时刻的差值不仅要以时计,而且还要以分和秒来计算,这给人们带来不便。所以为了克服时间上的混乱,1884年在华盛顿召开的一次国际经度会议(又称国际子午线会议)上,规定将全球划分为24个时区(东、西各12个时区)。
2:GMT、UTC、CST、DST 时间
- UTC:整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated)。
- GMT:格林威治标准时间 (Greenwich Mean Time)指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。(UTC与GMT时间基本相同,本文中不做区分)
- CST:中国标准时间 (China Standard Time) UTC = GMT = CST - 8
- DST:夏令时(Daylight Saving Time) 指在夏天太阳升起的比较早时,将时间拨快一小时,以提早日光的使用。(中国不使用)
服务Docker化后
容器时间同步
mysql容器化后
docker cp /usr/share/zoneinfo/Asia/Shanghai 【容器id】:/etc/localtime
在windows创建一个my.conf 文件内容跟上面一样,然后上传到你的linux上一个文件下,运行:
docker cp /mydata/mysql/my.conf f0d5414ffdd4:/etc/mysql/mysql.conf.d/mysqld.cnf
springboot 项目docker部署后
一样,同步时间的操作。然后:dockerfile文件添加:
ENV TZ=Asia/Shanghai
因为:docker 化 java 项目,dockerfile生成镜像后,关于容器的操作是不生效的。
结束
我就是卡在这 dockerfile中添加的这一行这
如果这个文章里没有帮助到你的,请你一定要留言,咱们记录下来是什么问题,一起去总结。