时区问题

常见的时区概念

  • 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字段。

<pre>

@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();
}

</pre>

spring.jackson.timezone

<pre>
spring:
jackson:

time-zone: 'Asia/Shanghai'

time-zone: 'GMT+8'

time-zone: 'UTC'

</pre>

假如我现在位于东8时区, 时间为21点46分。

  • 打印的时间格式可能为

<pre>
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"}

</pre>

在数值上,东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

微明Studio
1 声望0 粉丝

« 上一篇
Bean生命周期