关于时区问题
时区问题
常见的时区概念
- UTC (协调世界时)。主要的世界时间标准。
- 本初子午线。位于英国伦敦,也叫0度经线。本初子午线所在的时区也叫零时区或中时区。
- 北京时间 (CST):中国的标准时间是 UTC+8(比零时区早8个小时)
- 位于本初子午线向东8个时区。
- GMT+8也是东8时区
时区计算
所求时间 = 已知时间 ± 时区差
比如
- 假如零时区为7号0点,则北京时间为7号8点。(UTC+8)
- 当零时区处于半夜时,位于东边的北京时间已经是早晨时间
关于时间戳
先划一个重点,时间戳不分时区。
java.util.Date
java.util.Date 不存储时区,也不默认表示零时区。它表示的是绝对的时间点。
Date的本质: 时间戳
在日期的打印过程中,时区可能会怎样造成影响?
现在存在一个实体类Person,now是Date字段。
@Data @Builder @NoArgsConstructor @AllArgsConstructor public class Person { private Long id; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date now; } @GetMapping("/api/timezone1") public Person timeZone1(){ return Person.builder() .now(new Date()) .build(); }spring.jackson.timezone
spring: jackson: # time-zone: 'Asia/Shanghai' # time-zone: 'GMT+8' time-zone: 'UTC'
假如我现在位于东8时区, 时间为21点46分。
- 打印的时间格式可能为
Asia/Shanghai {"id":null,"now":"2026-06-07 21:46:37"} GMT+8 {"id":null,"now":"2026-06-07 21:46:37"} UTC {"id":null,"now":"2026-06-07 13:46:37"}在数值上,东8区比UTC大8小时。
在实际使用中,如果配置成UTC,会导致得到的时间比结果数值小8小时
数据库(mysql)
mysql数据库时区
查询时区
SELECT @@global.time_zone, @@session.time_zone; SHOW VARIABLES LIKE 'time_zone';时区对mysql有什么影响(待本地验证)
比如现在数据库中存在一个字段 time1,类型是时间戳。
现在我在mybatis的mapper文件中包含一个判断 time1 >= ‘2026-06-07 00:00:00’。
jdbc url中时区为utc(零时区)。
mysql会将字符串’2026-06-07 00:00:00’根据当前会话时区转为一个绝对时间(时间戳?),进行比较
所以连接的url时区会影响判断的实际时间,比如会导致相差几个小时
关于mycat(后续补充)
mycat对时区是怎么处理的?
是否可以配置成东8区?
如果配置成东8区,那连接mycat应该使用什么时区?UTC?
小补充
GMT+8和UTC+8有什么区别
简单来说,在绝大多数日常编程和配置场景下,GMT+8 和 UTC+8 没有区别
GMT+8
- 格林尼治标准时间
- 天文时间
- 旧标准
- 不均匀
- 不需要润秒
UTC+8
- 协调世界时
- 原子时间
- 现用标准
- 极其稳定
- 需要润秒
tag
- 时区
- mysql
- spring
