时区与夏令时详解

本文介绍了夏令时的历史、目的及其对全球各地的影响,特别关注了在技术环境中的处理,如JVM、MySQL、Oracle等数据库系统如何处理夏令时,并详细讲解了时区表示方法和Linux、Java程序以及HTTP协议中的时区配置。
摘要由CSDN通过智能技术生成

夏令时(DST)由来

夏令时(Daylight Saving Time),也叫“夏时制”,由外国资本家19世纪初提出,目的是鼓励人们早睡早起,敦促工人工作,提升工作效率,降低能源损耗。

在夏季起始时,人为的将本地时间调快1小时(跟“世界标准时间UTC”无关);
在夏令时结束时,又人为的将本地时间调慢1小时(调整到本地标准时间)。

夏令时虽能节约资源,提升生产效率,但容易造成混乱。每年的夏令时时间段还不一样,比如美丽国:3月的第二个星期日开始,到11月的第一个星期日结束。

全世界有近110个国家每年要实行夏令时。欧洲和美洲国家几乎都实行夏令时,亚洲和非洲个别国家实行;美国除UTC-5不实行夏令时,其余地区都实行夏令时;俄罗斯自从2011年3月27日开始永久使用夏令时,不再调回;
我国1986实行夏令时,1992起结束夏令时。

夏令时配置问题

  • JVM、MySQL、ORACLE、GAUSS、DM等中包括夏令时的处理逻辑,不过在UTC/GMT标准配置下,不会进行夏令时的处理,只有通过地区名称表示的时区名才会触发夏令时处理。
  • 另外在应用侧不进行时区配置时,jdbc会读取MySQL的System_time_zone做为当前线程的时区,进行应用内部时间处理。
  • 如:
    • JVM:-Duser.timezone=America/Santiago
    • MySQL:set global time_zone=America/Santiago

GMT与UTC世界标准时间

GMT是前世界标准时,UTC是现世界标准时。UTC比GMT更精准,以原子时计时,适应现代社会的精确计时。

GMT = UTC + 0

格林威治标准时间(GMT)

是时区标准,代表0时区的时区,所有时区都以和 GMT之间的时区差做为参考。时区差:[-12, +12]

世界标准时间(UTC)

是时间标准,本地时间=UTC + 偏移量。偏移量:+/-[hh]:[mm],如:+08、-03:45。精确到分钟。

世界时间查询:https://24timezones.com/map_zh.php#/map

时区表示方法

以本初子午线始,经度每隔15°划分一个时区,在这个区域内,大家使用同样的标准时间。全球共分为24个标准时区,相邻时区的时间相差1小时。

在不同地区,除了使用标准世界时表示的时区外(如:GMT+08、UTC-3:30),往往还会有不同的时区名称(如:Asia/Shanghai、America/Santiago),名称中通常会包含该国该地区的地理信息。

时区表示方式1 - GMT:

  • 本地时间=GMT + 时区差
  • 时区差:东x区为正,西x区为负。

时区表示方式2 - UTC:

  • 本地时间=UTC + 偏移量
  • 偏移量:+/[hh]:[mm],如:+08、-03:45。精确到分钟。

时区表示方式3 - CST:

  • CST:这个缩写可以表示四个不同的时间,如下
    • 中国(China Standard Time):UTC+8
    • USA(Central Standard Time):UTC-6
    • 澳大利亚(Central Standard Time):UTC+9:30
    • Cuba Standard Time UTC-4:00

时区表示方式4 - 地区名称:

  • 本地时区名称表示:如Asia/Shanghai、America/Santiago

时区配置

linux时区

- ls -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
- echo "Asia/Shanghai" > /etc/timezone
- sudo timedatectl set-timezone 'Asia/Shanghai'

JVM时区

- -Duser.timezone=时区
- 时区:支持4种时区表示方式,只有地区名称的时区才会触发JVM处理夏令时。

JAVA程序中

- System.setProperty("user.timezone", "Asia/Shanghai");
- TimeZone.setDefault("Asia/Shanghai")

Http协议

所有HTTP日期/时间戳都必须用格林威治标准时间(GMT)表示,没有例外。
对于HTTP来说,GMT完全等于UTC(协调世界时),这一切都是由浏览器自动帮你完成的。

DBMS时区

- Mysql
	- system_time_zone:系统时区,跟随操作系统,无法改变。
	- time_zone:用户(session会话)时区,默认为SYSTEM,表示使用CST时区进行时间处理,用户可以更改。
	- set global time_zone='时区'
	- 时区
		- 支持4种时区配置格式,但不支持:set global  time_zone="GMT +08"
		- mysql默认没有配置这些时区,需自行导入:mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
		- 系统支持的时区位置在/usr/share/zoneinfo目录下
		- 夏令时问题:
		在UTC/GMT标准配置下,不会进行夏令时的处理,配置为地区名即可,如:set global time_zone='America/Chicago';
- Oracle
	- 为整个数据库设置时区:ALTER DATABASE SET TIME_ZONE = 'Asia/Shanghai'
	- 为会话设置时区:ALTER SESSION SET TIME_ZONE = 'Asia/Shanghai';
	- Oracle数据库系统时间是由操作系统管理的。
- 其他数据库:方法同上。
  • 26
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值